如何可视化单词模式?
How to visualize word patterns?
我的数据结构如下所示:
<client>: {
<document>: [
{'start': <datetime>,
'end': <datetime>,
'group': <string>}
]
}
<document>
中的词典列表按 'start'
日期排序,新条目不能在其结束的条目之前开始。我遍历这个数据结构,并随着时间的推移收集 group
的值到一个新的结构中,例如:
<client>: {
<document>: {'progression': <group_1>|<group_2>|...|<group_n>}
}
其中 <group_1>
对应 <document>
中第一个字典的 'group'
的值,依此类推。我想为所有文档可视化 groups
的进程,例如,我知道我有 5,000 个以 "abc" 开头的条目(在第一个管道之前);其中,2,000 后面跟着 "def",所以 "abc"|"def"
。其中,500 个恢复为 "abc":"abc"|"def"|"abc"
,其余 1,500 个恢复为 "ghi":"abc"|"def"|"ghi"
。以 "abc" 开头的其余 3,000 个条目遵循一些不同的进展模式。
我想做的是通过类似于 Sankey 图或其他适当的树状结构来可视化这个进程,其中顶部节点将是 "abc",然后会有一个左边的 "thick" 分支对应不同的进展模式,右边的 "thinner" 分支对应 2,000 "abc" 个案例,然后是 "def"。那么 "def" 将是另一个具有相似分支的节点,一个导致新的 "abc" (对于 "abc"|"def"|"abc"
的情况)和一个导致 "ghi" (对于 "abc"|"def"|"ghi"
案例),最好在 "tree" 变薄时用每个节点中的计数进行注释。我使用 Python Counter
结构的组合来检索每个潜在进展的数字,但我不知道如何以编程方式创建可视化。
我的理解是大概是可以用dot语言解决的问题,还有像pydot
and/orpygraphviz
这样的包,但是我不确定我是不是在正确的轨道。
我认为在您的情况下,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 在 plotly 中如何工作的更多信息。
我的数据结构如下所示:
<client>: {
<document>: [
{'start': <datetime>,
'end': <datetime>,
'group': <string>}
]
}
<document>
中的词典列表按 'start'
日期排序,新条目不能在其结束的条目之前开始。我遍历这个数据结构,并随着时间的推移收集 group
的值到一个新的结构中,例如:
<client>: {
<document>: {'progression': <group_1>|<group_2>|...|<group_n>}
}
其中 <group_1>
对应 <document>
中第一个字典的 'group'
的值,依此类推。我想为所有文档可视化 groups
的进程,例如,我知道我有 5,000 个以 "abc" 开头的条目(在第一个管道之前);其中,2,000 后面跟着 "def",所以 "abc"|"def"
。其中,500 个恢复为 "abc":"abc"|"def"|"abc"
,其余 1,500 个恢复为 "ghi":"abc"|"def"|"ghi"
。以 "abc" 开头的其余 3,000 个条目遵循一些不同的进展模式。
我想做的是通过类似于 Sankey 图或其他适当的树状结构来可视化这个进程,其中顶部节点将是 "abc",然后会有一个左边的 "thick" 分支对应不同的进展模式,右边的 "thinner" 分支对应 2,000 "abc" 个案例,然后是 "def"。那么 "def" 将是另一个具有相似分支的节点,一个导致新的 "abc" (对于 "abc"|"def"|"abc"
的情况)和一个导致 "ghi" (对于 "abc"|"def"|"ghi"
案例),最好在 "tree" 变薄时用每个节点中的计数进行注释。我使用 Python Counter
结构的组合来检索每个潜在进展的数字,但我不知道如何以编程方式创建可视化。
我的理解是大概是可以用dot语言解决的问题,还有像pydot
and/orpygraphviz
这样的包,但是我不确定我是不是在正确的轨道。
我认为在您的情况下,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 在 plotly 中如何工作的更多信息