在Python中,节点由值思考并由可变宽度的流连接的类似Sankey的图?
是否有一种方法可以制作一个类似于Sankey图的流程图,但需要:在Python中,节点由值思考并由可变宽度的流连接的类似Sankey的图?,python,graph,data-visualization,diagram,sankey-diagram,Python,Graph,Data Visualization,Diagram,Sankey Diagram,是否有一种方法可以制作一个类似于Sankey图的流程图,但需要: 由值考虑的节点大小 可变流宽度,以便: 如果值[出发节点]
- 由值考虑的节点大小
- 可变流宽度,以便:
- 如果值[出发节点]<值[到达节点],则流宽度增加
- 如果值[到达节点]<值[离开节点],则流宽度减小
以下是一个例子:
- 当t=0时,A组或B组中有10个个体,每个个体都有一些值
- 当t=1时,个体被转移到C组或D组,其值发生变化
import pandas as pd
import plotly.graph_objects as go
df = pd.DataFrame()
df['Individual'] = ['x' + str(i+1) for j in range(2) for i in range(10)]
df['Time'] = [t for t in range(2) for i in range(10)]
df['Group'] = (['A' for i in range(7)] + ['B' for i in range(3)] + ['C', 'D', 'D', 'D', 'C', 'D', 'D', 'C', 'D', 'D'])
df['Value'] = [1, 3, 2, 2, 5, 3, 2, 10, 12, 8, 3, 6, 3, 4, 1, 2, 3, 2, 4, 2]
d_transfer = {}
for source in set(df[df['Time'] == 0]['Group']):
ref = df[df['Time'] == 1][df[df['Time'] == 1]['Individual'].isin(df[df['Group'] == source]['Individual'])]
d_transfer[source] = {target: len(ref[ref['Group'] == target]) for target in set(ref['Group'])}
labels = list(set(df['Group']))
sources = [labels.index(s) for s in d_transfer for i in range(len(d_transfer[s]))]
targets = [labels.index(t) for s in d_transfer for t in d_transfer[s]]
values = [d_transfer[s][t] for s in d_transfer for t in d_transfer[s]]
link = dict(source = sources, target = targets, value = values)
node = dict(label = labels, pad=50, thickness=5)
data = go.Sankey(link = link, node=node)
fig = go.Figure(data)
fig.update_layout(
xaxis_title="X Axis Title",
yaxis_title="X Axis Title",
legend_title="Legend Title",
font=dict(
family="Courier New, monospace",
size=40,
color="RebeccaPurple")
)
fig.show()