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)
关键说明
domain参数:domain接受x或y的范围数组([min, max]),取值在0到1之间,代表占画布的比例。这里我们用y参数把画布分成上下两部分,也可以用x参数实现左右排列。- 索引修复:原代码中trace2的
target包含值7,但对应的label只有7个元素(索引0-6),会触发索引越界错误,我已经将其修改为5。
运行这段代码就能正常显示两个上下排列的Sankey图了!
内容的提问来源于stack exchange,提问作者Hiterunner
相关产品推荐
相关产品推荐

