我有一个看起来像这样的数据结构:
<client>: {
<document>: [
{'start': <datetime>,
'end': <datetime>,
'group': <string>}
]
}
<document>
中的词典列表按'start'
日期排序,并且新条目不能在其终止之前开始。我遍历此数据结构,并随着时间的推移收集group
的值,例如:
<client>: {
<document>: {'progression': <group_1>|<group_2>|...|<group_n>}
}
其中<group_1>
对应于'group'
中第一个字典的<document>
的值,依此类推。我想可视化所有文档的groups
的进度,例如,我知道我有5,000个以“ abc”开头的条目(在第一个管道之前);其中的2,000后跟“ def”,因此"abc"|"def"
。其中的500个恢复为“ abc”:"abc"|"def"|"abc"
,其余1,500个后跟“ ghi”:"abc"|"def"|"ghi"
。其余3,000个以“ abc”开头的条目遵循不同的进度模式。
我要做的是通过类似于Sankey图或其他合适的树状结构的可视化过程,其中顶部节点为“ abc”,然后会有一个“ thick”分支左侧的“细”分支对应于不同的进展模式,右侧的“细”分支对应于2,000个“ abc”案例,后跟“ def”。然后,“ def”将是具有相似分支的另一个节点,一个节点导致一个新的“ abc”(对于"abc"|"def"|"abc"
情况)和一个导致“ ghi”(对于"abc"|"def"|"ghi"
情况),最好进行注释每个节点的计数随着“树”的变薄而减少。我使用Python Counter
结构的组合来检索每个潜在进度的数字,但是我不知道如何以编程方式创建可视化。
我的理解是,这可能是可以使用点语以及pydot
和/或pygraphviz
之类的程序包解决的问题,但是我不确定自己是否走对了轨道。
答案 0 :(得分:1)
我认为在您的情况下,Sankey图将是最佳选择。假设您具有data
结构,该结构从此处存储您的网上论坛信息:'progression': <group_1>|<group_2>|...|<group_n>
。然后,您可以像这样构造Sankey图:
data = [
[1,2,3,1,4],
[1,4,2],
[1,2,5,3,5],
[1,3],
[1,4,5,1,4,3],
[1,5,4,3],
[1,2,5,1,3,4],
[1,5],
[1,2,1,1,5,2],
[1,5,4,3],
[1,1,2,3,4,1]
]
# Append _1, _2... indices to differ paths like 1-2-2-1 and 1-2-1-2
nodes = sorted(list(set(itertools.chain(*[[str(e) + '_' + str(i) for i, e in enumerate(l)] for l in data]))))
countered = defaultdict(int)
for line in data:
for i in range(len(line) - 1):
countered[(str(line[i]) + '_' + str(i), str(line[i+1]) + '_' + str(i+1))] += 1
links = [
{'source': key[0], 'target': key[1], 'value': value}
for key, value in countered.items()
]
links = {
'source': [nodes.index(key[0]) for key, value in countered.items()],
'target': [nodes.index(key[1]) for key, value in countered.items()],
'value': [value for key, value in countered.items()]
}
data_trace = dict(
type='sankey',
domain = dict(
x = [0,1],
y = [0,1]
),
orientation = "h",
valueformat = ".0f",
node = dict(
pad = 10,
thickness = 30,
line = dict(
color = "black",
width = 0
),
label = nodes
),
link = links
)
layout = dict(
title = "___",
height = 772,
font = dict(
size = 10
),
)
fig = dict(data=[data_trace], layout=layout)
iplot(fig, validate=True)
它将为您绘制一个Sankey图,
您可以在here中找到有关Sankey如何工作的更多信息。