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

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添加的先后顺序从上到下排列图例,可根据需求选择以下两种调整方式:

  1. 精确自定义排序:给每个需要在图例展示的trace设置legendrank参数,参数为整数类型,数值越小对应的图例项排序越靠前,不需要调整trace的添加顺序即可实现任意排序
  2. 快速反转顺序:如果只需要把默认图例顺序完全倒转,不需要逐个配置rank,直接在布局中添加配置即可:
    fig.update_layout(legend_traceorder="reversed")
    

提示:当前代码中周末填充块固定在子图顶部窄条区域,如果需要让灰色填充贯穿整个子图高度,可以将Is_Weekend的取值映射为对应子图Y轴的最大值,适当调低填充透明度即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:15:17