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

如何翻转Matplotlib次Y轴刻度标签符号(不修改数据)

解决Matplotlib双Y轴刻度标签符号翻转问题

核心思路是仅修改次Y轴的刻度显示文本,不改变轴的实际数值范围和曲线数据,避免曲线形态错位。以下是具体实现步骤:

问题分析

直接修改次Y轴的ylim(如ax2.set_ylim(0.8, -0.2))会反转轴的数值方向,导致曲线上下颠倒,不符合“不修改曲线形态”的要求。正确做法是通过自定义刻度格式化器,将显示的标签取反,同时保留轴的原始数值范围。

完整实现代码

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import FuncFormatter

# 模拟10Y、30Y国债收益率及Spread数据
dates = np.arange('2020-01', '2023-01', dtype='datetime64[M]')
ten_year = np.random.uniform(1.5, 3.5, size=len(dates))
thirty_year = np.random.uniform(2.0, 4.0, size=len(dates))
spread = thirty_year - ten_year  # 原始Spread范围约-0.2到0.8

# 创建主图和主Y轴
fig, ax1 = plt.subplots(figsize=(12,6))
ax1.plot(dates, ten_year, label='10年期国债收益率')
ax1.plot(dates, thirty_year, label='30年期国债收益率')
ax1.set_ylabel('收益率(%)')
ax1.legend(loc='upper left')
ax1.grid(alpha=0.3)

# 创建次Y轴并绘制Spread曲线
ax2 = ax1.twinx()
ax2.plot(dates, spread, label='Spread(30Y-10Y)', color='red')

# 定义刻度标签反转函数:将轴实际数值取反后显示
def reverse_tick_label(x, pos):
    return f"{-x:.1f}"  # 可修改.1f为.2f调整小数位数

# 应用自定义格式化器到次Y轴
ax2.yaxis.set_major_formatter(FuncFormatter(reverse_tick_label))
# 锁定原轴范围,确保曲线位置不变
ax2.set_ylim(ax2.get_ylim())

ax2.set_ylabel('Spread(反转标签)')
ax2.legend(loc='upper right')

plt.title('国债收益率及Spread(次Y轴标签反转)')
plt.show()

关键说明

  1. 自定义格式化器:FuncFormatter允许我们自定义刻度标签的显示内容,这里仅对显示的文本取反,轴的实际数值仍保持原始范围,曲线形态完全不变。
  2. 锁定轴范围:ax2.set_ylim(ax2.get_ylim())确保次Y轴保留绘制Spread后的原始范围,避免因格式化器导致的刻度错位。
  3. 次要刻度处理:如果需要反转次要刻度标签,可添加ax2.yaxis.set_minor_formatter(FuncFormatter(reverse_tick_label))。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:35:17