python - 如何在桑基图中对节点进行排序(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()
有任何想法吗?
解决方案
推荐阅读
- c - 如何计算比赛?
- django - django 自定义保存方法以更改默认数据库
- angular - 路由器历史中的 Ionic 4/Angular 循环
- python - 如何在 gRPC 客户端-服务器框架上强制进行多处理以进行网络爬取?
- algorithm - DBSCAN/OPTICS 算法中是否包含半径 epsilon?
- ruby-on-rails-4 - Rails 服务器在 GCP VM 实例上运行,但无法在浏览器上访问 rails 应用程序
- python-3.x - Selenium-Webdriver 允许在一个窗口中打开多个选项卡,但在加载配置文件时不允许?
- node.js - nodejs自动维护winston日志
- windows - 我想用 Vagrant 在 OSX 上运行一个基本的 Windows 来宾,但我不断收到身份验证失败
- swift - 从初始化程序返回而不初始化所有存储的属性Swift Xcode 10.0