首页 > 解决方案 > 如何在桑基图中对节点进行排序(Plotly)

问题描述

我想实现一个可视化,显示一个状态到另一个状态之间变化的频率,这些状态表示为数字。 我的数据看起来像这样,调用df_sankey

我正在按照文档中的示例考虑桑基图。所以我想要一列状态 A 为 I1、I2、...、I20,另一列状态 B 为 F1、F2、...、F20。然后每对值之间的频率将表示为加权线,如下所示

但是,我无法根据状态数对列中的节点进行排序。这就是我想要实现的。

这是我尝试过的:

#Create Labels
source = pd.DataFrame(np.arange(1,21), columns = ['source'])['source'].apply(lambda x: 'I' + str(x))
target = pd.DataFrame(np.arange(1,21), columns = ['target'])['target'].apply(lambda x: 'F' + str(x))
labels = pd.concat([source, target], axis=0).reset_index(drop=True)

#X-node
x_node = np.concatenate((np.ones(int(len(source)))*0.1, np.ones(int(len(target)))), axis = None)

#Y-node
y_node = np.tile(np.linspace(0,100,len(source)),2)

#Create Dataframe
df_nodes = pd.DataFrame(data = {'label': labels, 'X': x_node, 'Y': y_node})

#阴谋

fig = go.Figure(data=[go.Sankey(
    arrangement='snap',
    node = dict(
      pad = 15,
      thickness = 20,
      line = dict(color = "black", width = 0.5),
      label = df_nodes['label'],
      color = "blue",
      x = df_nodes['X'],
      y = df_nodes['Y']
    ),
    link = dict(
      source = df_sankey['State_A']-1, #Indices correspond to labels, eg A1, A2, A1, B1, ...
      target = df_sankey['State_B']+20-1,
      value = df_sankey['Freq']
  ))])

fig.update_layout(title_text="Basic Sankey Diagram", font_size=10)
fig.show()

有任何想法吗?

标签: pythonplotlysankey-diagram

解决方案


推荐阅读