我正在尝试制作一个在Matplotlib中覆盖数十年的对数日志图。然而,返回给我的默认x轴刻度远非理想,因为它们一次覆盖二十年,其间只有4个刻度线。我正在使用的代码如下:
rc('text', usetex=True)
f,ax=plt.subplots(figsize=(10,8))
plt.xscale('log')
plt.yscale('log')
plt.ylim([1e26,1e29])
plt.xlim([20,1e10])
plt.xlabel(r'x',fontsize=22)
plt.ylabel(r'y',fontsize=22)
plt.tick_params(axis='both', which='major', labelsize=22,length=9,direction='in')
plt.tick_params(axis='both', which='minor', labelsize=22,length=5,direction='in')
ax.yaxis.set_tick_params(right='on',which='both')
ax.xaxis.set_tick_params(top='on',which='both')
plt.savefig('example.pdf',bbox_inches='tight')
返回给我的图片如下所示:
如您所见,主要的x轴标签从10 ^ 3到10 ^ 5等。另一方面,主要标签之间只有4个小的x轴标签。我希望每十年都有一些主要的标签,就像在y轴上一样,每十年之间标准的8个标记。此外,我理想地希望x轴上的标记保持现状,以使轴不会太杂乱。也就是说,我希望10 ^ 3,10 ^ 5,10 ^ 7,10 ^ 9被标记为现在。我只是想将主要/次要标题扩展到两者之间的所有几十年。
提前致谢。此外,如果它有用,我正在使用matplotlib版本2.0.0。我需要使用此版本(而不是旧版本)来获得仅在2.0.0中的其他功能。
答案 0 :(得分:1)
似乎对于v2,matplotlib改为减少它在跨越大范围的对数轴上绘制的刻度/标签的数量。下面的代码显示了添加滴答的一种方法。
使用此代码,
import pylab as plt
import numpy as np
from matplotlib.ticker import LogLocator
plt.rc('text', usetex=True)
f,ax=plt.subplots(figsize=(10,8))
plt.xscale('log')
plt.yscale('log')
plt.ylim([1e26,1e29])
plt.xlim([20,1e10])
plt.xlabel(r'x',fontsize=22)
plt.ylabel(r'y',fontsize=22)
plt.tick_params(axis='both', which='major', labelsize=22,length=9,direction='in')
plt.tick_params(axis='both', which='minor', labelsize=22,length=5,direction='in')
ax.yaxis.set_tick_params(right='on',which='both')
ax.xaxis.set_tick_params(top='on',which='both')
# manipulate x-axis ticks and labels
ax.xaxis.set_major_locator(LogLocator(numticks=15)) #(1)
ax.xaxis.set_minor_locator(LogLocator(numticks=15,subs=np.arange(2,10))) #(2)
for label in ax.xaxis.get_ticklabels()[::2]:
label.set_visible(False) #(3)
plt.savefig('example.pdf',bbox_inches='tight')
我每十年获得一个主要的蜱,主要蜱之间有8个小蜱,每个其他主要蜱都有轴标签。但由于我刚刚发布了一个帐户来发布这个答案,我没有足够的声誉来分享相应的图像:(。
每个标记行的一些细节(参见上面代码中的编号注释):
matplotlib/lib/matplotlib/ticker.py
的源代码。