在对数图中重叠轴刻度标签

时间:2017-09-29 23:39:50

标签: python matplotlib

我有一些代码在大约一年前使用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的科学记谱法的默认标签部分覆盖。所以看来上面的代码用于替换默认的刻度和标签,而现在它只是添加给它们。

我该怎样做才能重新获得理想的行为?为什么它首先改变了?

2 个答案:

答案 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)

result with minor ticks disabled: no overlaps

至于何时发生了变化:使用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()

enter image description here

总的来说,这个解决方案比通过.yticks手动设置刻度线更加通用。