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

Plotly如何实现共享y轴、同时展示day与date的双x轴绘图

Plotly双X轴折线图实现方案

你可以在Plotly生成的基础图表上,通过更新布局配置新增第二个X轴,和原有X轴的刻度位置对齐后替换为对应date列的文本即可,两种常用实现方式如下:

方式1:基于Plotly Express现有图表修改(改动最小)

直接在你现有的px.line代码基础上新增顶层X轴配置即可,无需调整绘图逻辑:

import pandas as pd
import plotly.express as px

# 示例DataFrame
df = pd.DataFrame(data={'day': [1,2,3,4,5], 'date': pd.date_range("2020-01-01", periods=5, freq="D"), 'value': [43,45,52,55,63]})

# 你原有基础绘图代码
fig = px.line(df, x='day', y='value')

# 新增顶部X轴配置
fig.update_layout(
    # 第二个X轴配置
    xaxis2=dict(
        title="date",
        overlaying="x", # 与原有底部X轴共用同一坐标系
        side="top", # 显示在图表顶部
        tickmode="array",
        tickvals=df["day"], # 刻度位置和底部X轴的day值一一对应
        ticktext=df["date"].dt.strftime("%Y-%m-%d") # 刻度文本替换为日期
    ),
    margin=dict(t=50) # 调整上边距避免X轴标题被截断
)

fig.show()

如果需要两个X轴都放在底部相邻排布,修改配置如下即可:

fig.update_layout(
    xaxis=dict(
        title="day",
        domain=[0, 1]
    ),
    xaxis2=dict(
        title="date",
        overlaying="x",
        side="bottom",
        position=0.15, # 向下偏移,和第一个X轴错开
        tickmode="array",
        tickvals=df["day"],
        ticktext=df["date"].dt.strftime("%Y-%m-%d")
    ),
    margin=dict(b=80) # 调大下边距容纳两个X轴
)

方式2:基于Plotly Graph Objects实现(灵活性更高)

如果需要更复杂的坐标轴自定义,可以直接用go模块构建图表:

import plotly.graph_objects as go

fig = go.Figure()
# 添加折线,用day作为X轴值
fig.add_trace(go.Scatter(x=df["day"], y=df["value"], mode="lines"))

# 配置双X轴
fig.update_layout(
    xaxis=dict(
        title="day",
        tickmode="array",
        tickvals=df["day"]
    ),
    xaxis2=dict(
        title="date",
        overlaying="x",
        side="top",
        tickmode="array",
        tickvals=df["day"],
        ticktext=df["date"].dt.strftime("%Y-%m-%d")
    ),
    yaxis_title="value",
    margin=dict(t=50)
)

fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:45:08