如何形象化单词模式?

时间:2019-05-16 04:10:56

标签: python networkx graphviz pydot altair

我有一个看起来像这样的数据结构:

<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之类的程序包解决的问题,但是我不确定自己是否走对了轨道。

1 个答案:

答案 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图,

enter image description here

您可以在here中找到有关Sankey如何工作的更多信息。