You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly多桑基图子图报错:'xaxis'属性无效问题求助

解决Plotly中创建多个Sankey子图的报错问题

问题原因

这不是Plotly的Bug,而是Sankey图表的定位逻辑和常规图表不同导致的:

  • 折线图、柱状图这类图表依赖xaxis/yaxis确定位置,tools.make_subplots就是为这类图表设计的,它会自动给添加的trace设置xaxis/yaxis属性来绑定子图坐标轴。
  • 但Sankey是独立图表类型,它不使用xaxis/yaxis,而是通过自身的domain属性控制在画布上的位置。所以当make_subplots试图给Sankey trace添加xaxis属性时,就会触发"Invalid property"的报错。

解决方案:用domain属性手动定位多个Sankey图

我们不需要依赖make_subplots,直接创建Figure对象并添加多个Sankey trace,通过每个Sankey的domain参数分配它们在画布上的空间即可。

修改后的完整代码如下:

import plotly.offline as offline
import plotly.graph_objs as go
offline.init_notebook_mode(connected = True)

# 第一个Sankey图,占画布上半部分
trace1 = go.Sankey(
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(color = "black", width = 0.5),
        label = ["Joe", "Molly", "Gavin", "Octavio", "Leslie", "Natasha"],
        color = ["blue", "red", "green", "yellow", "brown", "magenta"]
    ),
    link = dict(
        source = [0,1,3],
        target = [5,5,0],
        value = [6,8,3]
    ),
    # 设置domain:y轴方向从0.5到1,占上半部分
    domain = dict(y = [0.5, 1.0])
)

# 第二个Sankey图,占画布下半部分
trace2 = go.Sankey(
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(color = "black", width = 0.5),
        label = ["Russia", "Gambia", "Sweden", "Bolivia", "Timor-Leste", "Kazakhstan", "Bhutan"],
        color = ["red", "black", "brown", "magenta", "yellow", "blue", "orange"]
    ),
    link = dict(
        source = [0,1,4,6],
        target = [5,5,5,3],  # 修复原代码索引越界问题:原target[7]超出label索引范围
        value = [6,8,3,3]
    ),
    # 设置domain:y轴方向从0到0.5,占下半部分
    domain = dict(y = [0.0, 0.5])
)

# 创建Figure并添加两个trace
fig = go.Figure(data=[trace1, trace2])

# 更新布局
fig.update_layout(
    title = "Basic Sankey Diagram with Two Subplots",
    font = dict(size = 10),
    height = 600  # 调整画布高度让两个图显示更舒展
)

offline.iplot(fig)

关键说明

  1. domain参数:domain接受x或y的范围数组([min, max]),取值在0到1之间,代表占画布的比例。这里我们用y参数把画布分成上下两部分,也可以用x参数实现左右排列。
  2. 索引修复:原代码中trace2的target包含值7,但对应的label只有7个元素(索引0-6),会触发索引越界错误,我已经将其修改为5。

运行这段代码就能正常显示两个上下排列的Sankey图了!

内容的提问来源于stack exchange,提问作者Hiterunner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:53:42