You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Python/Matplotlib绘制包含两个独立(非连通)流的桑基图

如何使用Python/Matplotlib绘制包含两个独立(非连通)流的桑基图

我懂你的需求——要画出两个完全独立的桑基流(L和P),但你当前的代码里两个桑基模块默认会自动衔接在一起,所以才会得到不符合预期的结果。别担心,咱们只需要调整几个参数就能让它们分开显示。

问题的核心是Matplotlib的Sankey类默认会把后续添加的流和前一个连接起来,所以我们需要通过指定子图设置偏移量来打破这个默认行为,让两个流完全独立。

下面是修改后的完整代码,我会标注关键调整点:

from matplotlib.sankey import Sankey
import matplotlib.pyplot as plt

# 创建一个子图,让两个桑基流都画在这个画布上
ax = plt.subplot()

# 第一个桑基流(L)
sankey = Sankey(ax=ax, unit=None)
sankey.add(flows=[200, -50, -100, -50],
           orientations=[0, 1, 0, -1],
           labels=['L', 'L1', 'L2', 'L3'],
           trunklength=1.0,  # 原来的200太大了,改成合理的相对长度值
           facecolor='#8dd3c7'  # 可选:给流加个颜色区分
          )

# 第二个桑基流(P),关键是添加offset参数让它偏移
sankey.add(flows=[200, -50, -100, -50],
           orientations=[0, 1, 0, -1],
           labels=['P', 'P1', 'P2', 'P3'],
           trunklength=1.0,
           offset=0.5,  # 控制垂直方向的偏移量,数值可根据需要调整
           facecolor='#fb8072'  # 用不同颜色区分两个流
          )

# 完成绘制
diagrams = sankey.finish()

# 可选:调整标签的位置,避免重叠
for diag in diagrams:
    diag.texts[-1].set_position((1.05, 0.5))

# 设置标题和布局,让图更美观
plt.title('独立双桑基流图')
plt.tight_layout()

plt.savefig('tests/TestPloting/Sankey.png')
plt.show()

关键参数说明:

  • ax=ax:把两个桑基流绑定到同一个子图上,确保它们在同一张图里显示
  • offset:这个参数是核心!它让第二个桑基流相对于第一个流产生垂直偏移,数值越大,两个流的距离越远
  • trunklength:原来的200是不合理的(这个参数是相对长度,不是像素),改成1.0左右的小数值更符合常规显示
  • facecolor:可选参数,给两个流设置不同颜色,更容易区分

运行这段代码后,你就能得到两个完全独立、互不连接的桑基流了,分别对应L和P的流向。如果觉得两个流的距离不合适,直接调整offset的数值就行(比如0.3或0.7)。

备注:内容来源于stack exchange,提问作者s.paszko

火山引擎 最新活动