Plotly子图箱线图多余间距消除问题咨询
问题:Plotly箱线图分组间距异常,子图箱线偏移
使用Plotly绘制分组箱线图时,箱线间出现多余间距,每个x轴刻度对应的分组被识别为6组(实际仅3组),导致第一个子图箱线偏左、第二个偏右。
原代码及异常效果如下:
from plotly.subplots import make_subplots import plotly.graph_objects as go x = ['day 1', 'day 1', 'day 1', 'day 1', 'day 1', 'day 1', 'day 2', 'day 2', 'day 2', 'day 2', 'day 2', 'day 2'] fig = make_subplots(rows=1, cols=2, shared_yaxes=True, vertical_spacing=0.03,) fig.add_trace(go.Box( y=[0.2, 0.2, 0.6, 1.0, 0.5, 0.4, 0.2, 0.7, 0.9, 0.1, 0.5, 0.3], x=x, name='kale', marker_color='#3D9970' ), row=1, col=1) fig.add_trace(go.Box( y=[0.6, 0.7, 0.3, 0.6, 0.0, 0.5, 0.7, 0.9, 0.5, 0.8, 0.7, 0.2], x=x, name='radishes', marker_color='#FF4136', ), row=1, col=1) fig.add_trace(go.Box( y=[0.1, 0.3, 0.1, 0.9, 0.6, 0.6, 0.9, 1.0, 0.3, 0.6, 0.8, 0.5], x=x, name='carrots', marker_color='#FF851B' ), row=1, col=1) # same for second plot fig.add_trace(go.Box( y=[0.2, 0.2, 0.6, 1.0, 0.5, 0.4, 0.2, 0.7, 0.9, 0.1, 0.5, 0.3], x=x, name='kale', marker_color='#3D9970' ), row=1, col=2) fig.add_trace(go.Box( y=[0.6, 0.7, 0.3, 0.6, 0.0, 0.5, 0.7, 0.9, 0.5, 0.8, 0.7, 0.2], x=x, name='radishes', marker_color='#FF4136', ), row=1, col=2) fig.add_trace(go.Box( y=[0.1, 0.3, 0.1, 0.9, 0.6, 0.6, 0.9, 1.0, 0.3, 0.6, 0.8, 0.5], x=x, name='carrots', marker_color='#FF851B' ), row=1, col=2) fig.update_layout( yaxis_title='normalized moisture', boxmode='group' # group together boxes of the different traces for each value of x ) fig.show()

原因分析
全局设置的boxmode='group'会将所有子图中同名的trace视为同一分组集合,因此每个x轴刻度下会预留6个箱线的位置(两个子图各3组),导致间距异常和箱线偏移。
解决方法
为每个子图单独配置箱线分组模式,避免跨子图的分组合并,无需修改trace名称,直接通过更新子图布局即可实现。
修正后代码
from plotly.subplots import make_subplots import plotly.graph_objects as go x = ['day 1', 'day 1', 'day 1', 'day 1', 'day 1', 'day 1', 'day 2', 'day 2', 'day 2', 'day 2', 'day 2', 'day 2'] fig = make_subplots(rows=1, cols=2, shared_yaxes=True, vertical_spacing=0.03,) # 第一个子图的trace fig.add_trace(go.Box( y=[0.2, 0.2, 0.6, 1.0, 0.5, 0.4, 0.2, 0.7, 0.9, 0.1, 0.5, 0.3], x=x, name='kale', marker_color='#3D9970' ), row=1, col=1) fig.add_trace(go.Box( y=[0.6, 0.7, 0.3, 0.6, 0.0, 0.5, 0.7, 0.9, 0.5, 0.8, 0.7, 0.2], x=x, name='radishes', marker_color='#FF4136', ), row=1, col=1) fig.add_trace(go.Box( y=[0.1, 0.3, 0.1, 0.9, 0.6, 0.6, 0.9, 1.0, 0.3, 0.6, 0.8, 0.5], x=x, name='carrots', marker_color='#FF851B' ), row=1, col=1) # 第二个子图的trace fig.add_trace(go.Box( y=[0.2, 0.2, 0.6, 1.0, 0.5, 0.4, 0.2, 0.7, 0.9, 0.1, 0.5, 0.3], x=x, name='kale', marker_color='#3D9970' ), row=1, col=2) fig.add_trace(go.Box( y=[0.6, 0.7, 0.3, 0.6, 0.0, 0.5, 0.7, 0.9, 0.5, 0.8, 0.7, 0.2], x=x, name='radishes', marker_color='#FF4136', ), row=1, col=2) fig.add_trace(go.Box( y=[0.1, 0.3, 0.1, 0.9, 0.6, 0.6, 0.9, 1.0, 0.3, 0.6, 0.8, 0.5], x=x, name='carrots', marker_color='#FF851B' ), row=1, col=2) # 为每个子图单独设置boxmode,替代全局设置 fig.update_layout( yaxis_title='normalized moisture', xaxis=dict(boxmode='group'), xaxis2=dict(boxmode='group') ) fig.show()
效果说明
修正后,每个子图的x轴刻度下仅显示3组箱线,多余间距被消除,箱线位置居中,布局恢复正常。
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

