Python Plotly按Type分组创建共享X轴子图及调整图例顺序
共享X轴分组子图实现方案(保留周末灰色填充+自定义图例顺序)
核心实现逻辑
- 创建子图时指定
rows=2, cols=1, shared_xaxes=True,生成上下排布、共用X轴的两个绘图区域,替代原有两个独立Figure的写法 - 两个子图均保留次坐标轴逻辑绘制周末灰色填充块,隐藏次坐标轴的刻度、网格线,避免干扰主数据展示
- 显式给数据折线配置图例名称,通过参数控制图例排序
完整可运行代码
import pandas as pd import numpy as np import plotly.graph_objects as go from plotly.subplots import make_subplots # 构造测试数据集 rng = pd.date_range('2022-04-09', periods=20, freq='D') first_df = pd.DataFrame({ 'Date': rng, 'Val' : np.random.randn(len(rng))}) first_df['Type'] = 'A' second_df = pd.DataFrame({ 'Date': rng, 'Val' : np.random.randn(len(rng))}) second_df['Type'] = 'B' final_df = pd.concat([first_df,second_df]).sort_values(by = 'Date') final_df['Is_Weekend'] = np.where((final_df['Date'].dt.weekday == 5), 1, 0 ) A_df = final_df[final_df['Type']=='A'] B_df = final_df[final_df['Type']=='B'] # 初始化2行1列共享X轴的子图,两个子图均开启次坐标轴 fig = make_subplots( rows=2, cols=1, shared_xaxes=True, specs=[[{"secondary_y": True}], [{"secondary_y": True}]], subplot_titles=("Type A", "Type B") ) # 绘制第一个子图(Type A数据) # 周末灰色填充层(次坐标轴,不显示图例) fig.add_trace( go.Scatter( x=A_df['Date'], y=A_df['Is_Weekend'], fill='tonexty', fillcolor='rgba(128,128,128, 0.2)', line_shape='hv', line_color='rgba(0,0,0,0)', showlegend=False ), row=1, col=1, secondary_y=True ) # A类数据折线 fig.add_trace( go.Scatter( x=A_df['Date'], y=A_df['Val'], line_color='orange', mode='lines+markers', name='Type A', legendrank=1 # 控制图例排序,数值越小越靠上 ), row=1, col=1, secondary_y=False ) # 绘制第二个子图(Type B数据) # 周末灰色填充层(次坐标轴,不显示图例) fig.add_trace( go.Scatter( x=B_df['Date'], y=B_df['Is_Weekend'], fill='tonexty', fillcolor='rgba(128,128,128,0.2)', line_shape='hv', line_color='rgba(0,0,0,0)', showlegend=False ), row=2, col=1, secondary_y=True ) # B类数据折线 fig.add_trace( go.Scatter( x=B_df['Date'], y=B_df['Val'], line_color='blue', mode='lines+markers', name='Type B', legendrank=2 ), row=2, col=1, secondary_y=False ) # 统一样式配置 # 隐藏所有次坐标轴的刻度、网格线,控制填充高度 fig.update_yaxes(range=[0, 0.1], showgrid=False, tickfont_color='rgba(0,0,0,0)', secondary_y=True) # 隐藏X轴网格线 fig.update_xaxes(showgrid=False) fig.show()
图例顺序调整方法
Plotly默认按照trace添加的先后顺序从上到下排列图例,可根据需求选择以下两种调整方式:
- 精确自定义排序:给每个需要在图例展示的trace设置
legendrank参数,参数为整数类型,数值越小对应的图例项排序越靠前,不需要调整trace的添加顺序即可实现任意排序 - 快速反转顺序:如果只需要把默认图例顺序完全倒转,不需要逐个配置rank,直接在布局中添加配置即可:
fig.update_layout(legend_traceorder="reversed")
提示:当前代码中周末填充块固定在子图顶部窄条区域,如果需要让灰色填充贯穿整个子图高度,可以将
Is_Weekend的取值映射为对应子图Y轴的最大值,适当调低填充透明度即可。
内容的提问来源于stack exchange,提问作者user9532692
相关产品推荐
相关产品推荐

