如何使用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




