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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:23:21