问题是ax.get_yticks()返回超出轴限制的刻度,在这种情况下:
In [6]: ax.get_yticks()
Out[6]: array([1.e-01, 1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05])
这就是为什么当您在附加自定义值后设置新刻度时,y 轴限制会发生变化。
选项 1:排除当前轴限制之外的刻度
我们可以通过一个简单的列表推导来解决这个问题,以排除当前ylim. 例如:
yticks_i_want = [y for y in ax.get_yticks() if (y >= ax.get_ylim()[0] and y <= ax.get_ylim()[1])]
yticks_i_want.append(2600.)
把它放在一个最小的例子中:
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
fig, ax = plt.subplots()
ax.set_yscale('log')
ax.set_ylim(1, 3000)
yticks_i_want = [y for y in ax.get_yticks() if (y >= ax.get_ylim()[0] and y <= ax.get_ylim()[1])]
yticks_i_want.append(2600.)
ax.set_yticks(yticks_i_want)
ax.yaxis.set_major_formatter(ticker.ScalarFormatter())
plt.show()
(注意ScalarFormatter())只是为了让刻度标签格式与问题中的格式相匹配,而不是使用科学风格)。

选项 2:添加刻度后重置轴限制
当然,一个简单的替代方法是在添加自定义刻度位置后再次设置轴限制:
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
fig, ax = plt.subplots()
ax.set_yscale('log')
ax.set_ylim(1, 3000)
ylim = ax.get_ylim()
yticks_i_want = np.append(ax.get_yticks(), 2600)
ax.set_yticks(yticks_i_want)
ax.set_ylim(*ylim)
ax.yaxis.set_major_formatter(ticker.ScalarFormatter())
plt.show()