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

如何修改Matplotlib(Python3)右侧Y轴的显示数值?

解决方案:给单条曲线添加自定义百分比右侧Y轴

没问题!你现在的需求其实可以通过创建一个独立的右侧Y轴来实现,虽然twinx()常被用于多曲线共享X轴的场景,但单条曲线下也完全适用——我们只是利用它来生成一个和左侧X轴对齐但Y轴独立的坐标轴而已。下面是具体的实现步骤和代码示例:

核心思路

  1. 先绘制你的原始曲线,获取默认的左侧坐标轴对象
  2. 使用twinx()创建右侧坐标轴,它会自动和左侧X轴对齐
  3. 通过自定义刻度格式化逻辑,把左侧Y轴的数值转换为相对于基准值的百分比
  4. 同步左右Y轴的刻度范围,保证数值对应关系准确

完整代码示例

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

# 替换成你的实际数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 12, 18, 20]
base_value = 10  # 这里设置你的基准值

# 绘制原始曲线,获取左侧坐标轴
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, y, color='#1f77b4', linewidth=2, label='原始数据')
ax.set_ylabel('左侧Y轴数值', fontsize=12)
ax.set_xlabel('X轴', fontsize=12)

# 创建右侧Y轴(和左侧X轴共享)
ax_right = ax.twinx()

# 定义自定义格式化函数:将左侧Y值转为基准值的百分比
def format_percent(y, pos):
    # y是左侧Y轴的数值,pos是刻度位置(这里用不到)
    percentage = (y / base_value) * 100
    return f'{percentage:.1f}%'  # 保留1位小数的百分比格式

# 给右侧Y轴应用格式化器
ax_right.yaxis.set_major_formatter(ticker.FuncFormatter(format_percent))
# 同步左右Y轴的范围,确保刻度一一对应
ax_right.set_ylim(ax.get_ylim())
ax_right.set_ylabel(f'相对于基准值{base_value}的百分比', fontsize=12, color='#ff7f0e')
# 可以给右侧刻度设置颜色,和标签呼应
ax_right.tick_params(axis='y', colors='#ff7f0e')

# 显示图例
ax.legend(loc='upper left')
plt.title('单条曲线+自定义右侧百分比Y轴', fontsize=14)
plt.tight_layout()
plt.show()

关键细节说明

  • 使用twinx()完全没问题:它的核心作用是创建共享X轴的第二个Y轴,不管你有没有多条曲线,这个功能都能用来生成独立的右侧Y轴
  • 格式化器更灵活:用FuncFormatter的好处是,当你拖拽缩放图表、调整左侧Y轴范围时,右侧的百分比会自动同步更新,不需要手动重新计算刻度
  • 如果想手动控制刻度:如果你偏好直接设置刻度数值,可以替换掉格式化器的部分,手动计算并设置右侧Y轴的刻度和标签:
# 手动设置右侧刻度的替代方案
left_ticks = ax.get_yticks()
right_ticks = [(tick / base_value) * 100 for tick in left_ticks]
ax_right.set_yticks(right_ticks)
ax_right.set_yticklabels([f'{tick:.1f}%' for tick in right_ticks])
ax_right.set_ylim([(ax.get_ylim()[0]/base_value)*100, (ax.get_ylim()[1]/base_value)*100])

这样就能实现你想要的效果:左侧显示原始数值,右侧显示对应数值相对于基准值的百分比啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:23:09