我有一些代码在大约一年前使用pyplot工作得非常好;我使用# set the axis limits
Tmin = -100 # min temperature to plot
Tmax = 40 # max temperature
Pmin = 100 # min pressure
Pmax = 1000 # max pressure
plt.axis([Tmin, Tmax, Pmax, Pmin])
# make the vertical axis a log-axis
plt.semilogy()
# make a custom list of tick values and labels
plist = range(Pmin,Pmax,100)
plabels = []
for p in plist:
plabels.append(str(p))
plt.yticks(plist,plabels)
使用对数y轴绘制了一个图,并使用自定义集替换了y轴刻度和刻度标签,如下所示:
{{1}}
在最近将我的python安装更新到当前版本的miniconda之后,我现在发现虽然新标签仍然出现,但它们被matplotlib的科学记谱法的默认标签部分覆盖。所以看来上面的代码用于替换默认的刻度和标签,而现在它只是添加给它们。
我该怎样做才能重新获得理想的行为?为什么它首先改变了?
答案 0 :(得分:4)
您遇到的问题是a known bug not easy to fix。问题的核心是主要和次要蜱的混合;设置yticks
重新定义主要刻度,次要刻度会导致重叠。
修复问题之前的解决方法是使用plt.minorticks_off()
(或ax.minorticks_off()
使用面向对象的API)手动禁用次要标记:
Tmin = -100 # min temperature to plot
Tmax = 40 # max temperature
Pmin = 100 # min pressure
Pmax = 1000 # max pressure
plt.axis([Tmin, Tmax, Pmax, Pmin])
# make the vertical axis a log-axis
plt.semilogy()
plt.minorticks_off() # <-- single addition
# make a custom list of tick values and labels
plist = range(Pmin,Pmax,100)
plabels = []
for p in plist:
plabels.append(str(p))
plt.yticks(plist,plabels)
至于何时发生了变化:使用matplotlib 2.0进行了came with the default style changes。
答案 1 :(得分:1)
也许值得一提的是,标记轴的方法通常是自动执行的。根据要显示的值范围,应用不同的设置,matplotlib style change到版本2.0状态
当轴视图限制范围小于或等于两个主要刻度之间的间隔时,现在标记对数轴上的小刻度。
从这个意义上讲,报告的行为并不是真正的错误;这是理想的。
在更改默认轴标签时,仍可使用自动标签。刻度和标签是使用matplotlib.ticker
的定位器和格式化程序创建的。例如,可以获得所需的图。如下所示,其中MultipleLocator
每100个单位设置一个刻度,而小刻度设置为NullLocator
。要将标记格式设置为标量值而不是科学格式,可以使用ScalarFormatter
。
from matplotlib import pyplot as plt
import matplotlib.ticker
plt.axis([-100, 40, 100, 1000])
plt.semilogy()
plt.gca().yaxis.set_major_locator(matplotlib.ticker.MultipleLocator(100))
plt.gca().yaxis.set_minor_locator(matplotlib.ticker.NullLocator())
plt.gca().yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
plt.plot([-100, 40], [100, 1000])
plt.show()
总的来说,这个解决方案比通过.yticks
手动设置刻度线更加通用。