被这个问题稍微难住了下,找到答案后不敢独享,希望能帮助其他朋友吧。
raw_data = [
("A1", "B1", "C1", 1),
("A1", "B1", "C1", 1),
("A1", "B1", "C2", 1),
("A1", "B2", "C1", 1),
("A1", "B2", "C1", 1),
("A1", "B2", "C2", 1),
("A1", "B2", "C2", 1),
("A2", "B1", "C1", 1),
("A2", "B1", "C1", 1),
("A2", "B1", "C2", 1),
("A2", "B1", "C2", 1),
("A2", "B2", "C1", 1),
("A2", "B2", "C1", 1),
("A2", "B2", "C2", 1),
("A2", "B2", "C2", 1)
]
那么我们可以使用以下代码生成树形图中所需的data数据
# Autovivification
# https://en.wikipedia.org/wiki/Autovivification
class Tree(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
tree = Tree()
for x, y, z, value in raw_data:
tree[x][y][z] = value
def walk_tree(tree):
for k, v in tree.items():
if isinstance(v, dict):
value_list = list(walk_tree(v))
result = {
"name": k,
"children": [x for x in value_list],
"value": sum([x['value'] for x in value_list])
}
yield result
else:
yield {"name": k, "value": float(v)}
data = [x for x in walk_tree(tree)]
结果如下,其中父级数据值会自动汇总
[{'children': [{'children': [{'value': 1.0, 'name': 'C1'}, {'value': 1.0, 'name': 'C2'}], 'value': 2.0, 'name': 'B2'}, {'children': [{'value': 1.0, 'name': 'C1'}, {'value': 1.0, 'name': 'C2'}], 'value': 2.0, 'name': 'B1'}], 'value': 4.0, 'name': 'A1'}, {'children': [{'children': [{'value': 1.0, 'name': 'C1'}, {'value': 1.0, 'name': 'C2'}], 'value': 2.0, 'name': 'B2'}, {'children': [{'value': 1.0, 'name': 'C1'}, {'value': 1.0, 'name': 'C2'}], 'value': 2.0, 'name': 'B1'}], 'value': 4.0, 'name': 'A2'}]
有了data数据后,在拼一个echarts的option就不是难事了,代码就不贴了。
总结:Autovivification这个单词是解决问题的钥匙。