我刚刚升级到matplotlib 2.0,我觉得我喜欢疯狂吃药。我试图制作一个对数线性图,其中y轴为线性刻度,x轴为log10刻度。以前,下面的代码可以让我准确指出我想要的刻度,以及我想要的标签:
import matplotlib.pyplot as plt
plt.plot([0.0,5.0], [1.0, 1.0], '--', color='k', zorder=1, lw=2)
plt.xlim(0.4,2.0)
plt.ylim(0.0,2.0)
plt.xscale('log')
plt.tick_params(axis='x',which='minor',bottom='off',top='off')
xticks = [0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0]
ticklabels = ['0.4', '0.6', '0.8', '1.0', '1.2', '1.4', '1.6', '1.8', '2.0']
plt.xticks(xticks, ticklabels)
plt.show()
但是在matplotlib 2.0中,这现在让我得到一组重叠的刻度标签,其中matplotlib显然想要自动创建刻度:
但如果我注释掉" plt.xlim(0.4,2.0)"线,并让它自动确定轴限制,没有重叠的刻度标签,我只是得到我想要的:
但这不起作用,因为我现在有无用的x轴限制。
有什么想法吗?
编辑:对于将来搜索互联网的人来说,我越来越相信这实际上是matplotlib本身的一个错误。我回到了1.5.3节。要避免这个问题。
答案 0 :(得分:7)
重叠的额外滴答标签来自一些小刻度标签,这些标签存在于图中。要摆脱它们,可以将次格式化程序设置为NullFormatter
:
plt.gca().xaxis.set_minor_formatter(matplotlib.ticker.NullFormatter())
问题中的完整代码可能看起来像
import matplotlib.pyplot as plt
import matplotlib.ticker
import numpy as np
x = np.linspace(0,2.5)
y = np.sin(x*6)
plt.plot(x,y, '--', color='k', zorder=1, lw=2)
plt.xlim(0.4,2.0)
plt.xscale('log')
xticks = [0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0]
ticklabels = ['0.4', '0.6', '0.8', '1.0', '1.2', '1.4', '1.6', '1.8', '2.0']
plt.xticks(xticks, ticklabels)
plt.gca().xaxis.set_minor_formatter(matplotlib.ticker.NullFormatter())
plt.show()
可能更直观的代码,因为它没有将xticklabels设置为字符串,我们使用FixedLocator
和ScalarFormatter
。
此代码生成与上面相同的图。
import matplotlib.pyplot as plt
import matplotlib.ticker
import numpy as np
x = np.linspace(0,2.5)
y = np.sin(x*6)
plt.plot(x,y, '--', color='k', zorder=1, lw=2)
plt.xlim(0.4,2.0)
plt.xscale('log')
xticks = [0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0]
xmajorLocator = matplotlib.ticker.FixedLocator(locs=xticks)
xmajorFormatter = matplotlib.ticker.ScalarFormatter()
plt.gca().xaxis.set_major_locator( xmajorLocator )
plt.gca().xaxis.set_major_formatter( xmajorFormatter )
plt.gca().xaxis.set_minor_formatter(matplotlib.ticker.NullFormatter())
plt.show()