如何翻转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()
关键说明
- 自定义格式化器:
FuncFormatter允许我们自定义刻度标签的显示内容,这里仅对显示的文本取反,轴的实际数值仍保持原始范围,曲线形态完全不变。 - 锁定轴范围:
ax2.set_ylim(ax2.get_ylim())确保次Y轴保留绘制Spread后的原始范围,避免因格式化器导致的刻度错位。 - 次要刻度处理:如果需要反转次要刻度标签,可添加
ax2.yaxis.set_minor_formatter(FuncFormatter(reverse_tick_label))。
内容的提问来源于stack exchange,提问作者user603535
相关产品推荐
相关产品推荐

