python桑基图源码
时间: 2023-10-12 14:14:58 浏览: 103
以下是使用Python和matplotlib库绘制桑基图的示例代码:
```python
import matplotlib.pyplot as plt
# 定义桑基图的数据
sankey_data = {
'A': {'B': 20, 'C': 30, 'D': 10},
'B': {'E': 15, 'F': 5},
'C': {'F': 25},
'D': {'E': 5, 'F': 15},
}
# 生成桑基图的节点和边
nodes = []
node_map = {}
node_counter = 0
edges = []
edge_weights = []
for k, v in sankey_data.items():
nodes.append(k)
node_map[k] = node_counter
node_counter += 1
for kk, vv in v.items():
nodes.append(kk)
node_map[kk] = node_counter
node_counter += 1
edges.append((node_map[k], node_map[kk]))
edge_weights.append(vv)
# 绘制桑基图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[])
sankey = ax.streamplot(range(len(nodes)), range(len(nodes)), edges, edge_weights,
cmap=plt.cm.Spectral_r, linewidth=0.5,
node_color='#0c2c84', node_edgecolor='white', node_size=600,
arrowstyle='->', arrowsize=10, arrowcolor='black',
label='Sankey', alpha=0.8)
# 添加桑基图的标签
labels = ['A', 'B', 'C', 'D', 'E', 'F']
for i in range(len(nodes)):
ax.text(i, -1, labels[i], fontsize=14, ha='center')
for i in range(len(edges)):
x = (sankey.lines[i].get_xdata()[0] + sankey.lines[i].get_xdata()[1])/2
y = (sankey.lines[i].get_ydata()[0] + sankey.lines[i].get_ydata()[1])/2
ax.text(x, y, edge_weights[i], fontsize=12, ha='center', va='center')
# 显示桑基图
plt.show()
```
在此示例中,我们使用一个字典来表示桑基图的数据,其中键表示节点,值表示该节点连接到的其他节点及其权重。然后,我们将数据转换为节点和边,并使用matplotlib库的streamplot函数来绘制桑基图。最后,我们添加标签和边权重,并显示桑基图。
阅读全文