在Python中,节点由值思考并由可变宽度的流连接的类似Sankey的图?

在Python中,节点由值思考并由可变宽度的流连接的类似Sankey的图?,python,graph,data-visualization,diagram,sankey-diagram,Python,Graph,Data Visualization,Diagram,Sankey Diagram,是否有一种方法可以制作一个类似于Sankey图的流程图,但需要: 由值考虑的节点大小 可变流宽度,以便: 如果值[出发节点]

是否有一种方法可以制作一个类似于Sankey图的流程图,但需要:

  • 由值考虑的节点大小
  • 可变流宽度,以便:
    • 如果值[出发节点]<值[到达节点],则流宽度增加
    • 如果值[到达节点]<值[离开节点],则流宽度减小
用Python


以下是一个例子:

  • 当t=0时,A组或B组中有10个个体,每个个体都有一些值
  • 当t=1时,个体被转移到C组或D组,其值发生变化

使用经典的Sankey图表,我可以显示从一个组到另一个组的个人数量:

我想展示的是一个流程图,它显示了在群体之间转换时个人价值观是如何演变的

下面是我想用Python制作的图表的手工插图:

例如,我们可以在这张图上看到,从B组转移到D组的个体的值之和从20到6

我把我用来制作经典的Sankey图的代码放在下面:

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()