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

Plotly Python双Y轴柱状图零位对齐问题求助

Plotly Python 双Y轴零位对齐实现方案

可以实现双Y轴零位对齐,核心是手动计算并同步两个Y轴的刻度范围,让零点处于同一水平位置。

问题原因

原代码中两个Y轴使用自动刻度,由于两组数据量级差异大,Plotly会分别计算各自的最优范围,导致零点无法对齐。

解决代码

修改后的完整代码如下:

import pandas as pd
from plotly.subplots import make_subplots
import plotly.graph_objects as go

data = {'col 1': [-6, 18.6, 106.35, 111],
        'col 2': [-787.5, 976.5, 11246, 25682]}
df_overview = pd.DataFrame(data)
df_overview.index = ['A', 'B', 'C', 'D']
colors = ['#FF0000', '#0000FF']  # red, blue
columns = ['col 1', 'col 2']

# 计算两个轴的极值,用于确定对齐零点的范围
y1_min, y1_max = df_overview['col 1'].min(), df_overview['col 1'].max()
y2_min, y2_max = df_overview['col 2'].min(), df_overview['col 2'].max()

# 计算每个轴需要延伸的比例,确保零点对齐
y1_abs_max = max(abs(y1_min), abs(y1_max))
y2_abs_max = max(abs(y2_min), abs(y2_max))
# 计算两个轴的比例,让零点到上下限的视觉高度一致
ratio = y1_abs_max / y2_abs_max if y2_abs_max != 0 else 1

# 设置两个轴的范围,确保零点对齐
y1_range = [-y1_abs_max, y1_abs_max]
y2_range = [-y2_abs_max, y2_abs_max] if ratio == 1 else [-y1_abs_max/ratio, y1_abs_max/ratio]

fig = make_subplots(specs=[[{"secondary_y": True}]])
for i, col in enumerate(columns):
    fig.add_trace(
        go.Bar(x=df_overview.index, y=df_overview[col], name=col, marker_color=colors[i], offsetgroup=i),
        secondary_y=(i == 0)
    )

fig.update_layout(
    barmode='group',
    font_size=14,
    hovermode="x unified",
)

# 更新Y轴范围,实现零点对齐
fig.update_yaxes(range=y1_range, secondary_y=False)
fig.update_yaxes(range=y2_range, secondary_y=True)

fig.show()

关键逻辑说明

  • 先获取两组数据的极值,计算各自的最大绝对值,确保正负方向的刻度范围以零点为中心对称
  • 通过计算两组数据最大绝对值的比例,调整第二个Y轴的范围,使得零点到上下限的视觉距离一致,从而实现零位对齐
  • 最后通过update_yaxes手动设置两个Y轴的范围,覆盖自动刻度逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:32:25