使用【python】写【Create a Sankey diagram with real data and clear definition of the system】的代码
时间: 2024-09-26 09:14:53 浏览: 63
要创建一个带有真实数据的Sankey图(一种可视化网络流量的图表),我们可以使用`networkx`库来构建图结构,然后用`plotly.express`或`sankey diagrams library`(如`sankeymatic`)来绘制。这里是一个简单的例子,我们将使用`plotly.express`:
首先,确保已经安装了所需的库,如果没有,可以通过pip安装:
```bash
pip install networkx plotly
```
以下是一个基本步骤的示例代码:
```python
import matplotlib.pyplot as plt
import networkx as nx
import pandas as pd
from plotly.graph_objs import Sankey
# 假设我们有一个包含数据的CSV文件,例如"data.csv",其中包含源、目标和值
df = pd.read_csv('data.csv')
# 创建一个字典,源为键,目标和值为值
nodes = df[['source', 'target']].values.tolist()
weights = df['value'].tolist()
# 使用networkx创建一个带权重的无向图
G = nx.DiGraph()
for node, (src, dst), weight in zip(nodes, weights):
G.add_edge(src, dst, weight=weight)
# 计算流的总和
total_flow = sum(G.edges(data='weight').values())
# 创建Sankey Diagram配置
config = {
'width': 800,
'height': 600,
'font': {'size': 12}
}
# 使用plotly创建Sankey图
fig = Sankey(
orientation='h',
node=dict(pad=15, thickness=20),
link=dict(arrows='to', line=dict(width=0.5)),
valueformat=".2f",
valuesuffix=" units",
texttemplate="<b>%{label}</b><br>flow: %{value:.2f} %{suffix}",
font=config['font'],
layout={'title': 'Sankey Diagram'}
)
# 添加节点和边到图
for node, data in G.nodes(data=True):
fig.add_trace(go.Sankey(node=dict(name=node, pad=15)))
for u, v, d in G.edges(data=True):
fig.add_trace(go.Sankey(link=dict(source=u, target=v, value=d['weight'] / total_flow)))
# 显示图形
fig.show()
```
在这个例子中,你需要替换`'data.csv'`为你的实际数据文件路径,同时根据你的数据调整列名。这个脚本假设数据集中有三列:`source`, `target`, 和 `value`,分别代表流量的起点、终点和流量大小。
阅读全文