PyPlot调用set_yticks后ylim与yticks无故变更问题
问题:调用set_yticks导致对数轴ylim和主刻度无故变更
参考在线代码为柱状图添加主yticks时发现,即便没有添加新的主刻度,仅调用ax.set_yticks(ax.get_yticks(minor=False))就会导致ylim和主yticks无故变更,核心代码如下:
import pandas as pd import matplotlib.pyplot as plt plt.close('all') ax = pd.Series([600,1e3,1e4],index=['A','B','C']).plot.bar() plt.yscale('log') # 此代码会导致ylim和主yticks变更 if False: ax.set_yticks( ax.get_yticks(minor=False) )
使用环境
- Spyder版本:6.0.5 (conda)
- Python版本:3.9.18 64-bit
- Qt版本:5.15.2
- PyQt5版本:5.15.10
- 操作系统:Windows-10-10.0.26100-SP0
补充说明(2025-06-16 15:28 ET)
目前找到临时解决方法:在调用set_yticks前保存ylim(ylim=plt.ylim()),之后再恢复(plt.ylim(ylim))来强制恢复yticks和ylim,但存在疑问:为何调用set_yticks会使用不同的启发式规则来确定ylim和yticks?
附录:sharey参数探索
曾尝试使用plt.subplots的sharey参数,但该参数仅适用于同一画布内两个子图y轴完全相同的场景。实际需求中,两个图不在同一画布且y轴不同,第二个图的yticks基于第一个图yticks的对数变换设置,验证代码如下:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.stats import weibull_min # 创建3组"Bin"的"Linear"数据,每组1000个点 bins=['Alpha','Brave','Charlie'] scales=[1,10,100] # 每组Weibull曲线的缩放比例 n_points = 1000 # 每组数据点数量 shape=0.5 # 曲线形状 df = pd.concat([ pd.DataFrame({ 'Bin':[bins[i_bin]]*n_points , 'Linear':weibull_min(c=shape,scale=scales[i_bin]).rvs(size=n_points) }) for i_bin in range(3) ]) # 线性箱线图,然后将y轴设为对数刻度 plt.close('all') fig,(ax1,ax2) = plt.subplots(1,2,layout='constrained',sharey=True) df.boxplot('Linear',by='Bin',ax=ax1) plt.yscale('log') # 数据对数变换后的箱线图 df['Log10'] = np.log10( df.Linear ) df.boxplot('Log10',by='Bin',ax=ax2)
(注:此为随机数据,箱线图的极值可能略有不同)
验证后发现sharey参数并不适用:第二个图的箱体和须线是基于对数变换后的数据计算的,无法在原始数据的坐标轴上正确显示,显然不需要sharey=True。
更实际的场景是:绘制线性数据并对其做对数变换以获取yticks,随后清除坐标轴并绘制对数变换后的数据以得到正确计算的须线,这种场景下不存在多个子图,sharey参数完全不适用。
内容的提问来源于stack exchange,提问作者user2153235
相关产品推荐
相关产品推荐

