Python Matplotlib:日志图中奇怪的双十年轴刻度

Python Matplotlib:日志图中奇怪的双十年轴刻度,python,matplotlib,plot,axis-labels,loglog,Python,Matplotlib,Plot,Axis Labels,Loglog,我试图在Matplotlib中绘制一个覆盖数十年的日志图。然而,返回给我的默认x轴刻度远非理想,因为它们一次覆盖20年,中间只有4个刻度线。我使用的代码如下所示: rc('text',usetex=True) f、 ax=plt.子批次(图尺寸=(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

我试图在Matplotlib中绘制一个覆盖数十年的日志图。然而,返回给我的默认x轴刻度远非理想,因为它们一次覆盖20年,中间只有4个刻度线。我使用的代码如下所示:

rc('text',usetex=True)
f、 ax=plt.子批次(图尺寸=(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_参数(轴='both',其中='major',标签大小=22,长度=9,方向='in')
plt.tick_参数(轴='both',其中='minor',标签大小=22,长度=5,方向='in')
ax.yaxis.set_tick_params(right='on',which='tware')
ax.xaxis.set_tick_params(top='on',which='tware')
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中才有的附加功能。

似乎在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个小刻度,并且每隔一个主刻度获得轴标签。但由于我刚刚做了一个账户来发布这个答案,我没有足够的声誉来分享相应的图片:(

关于每个标记行的一些详细信息(请参见上面代码中的编号注释):

  • 增加允许的最大记号数。值15是v1的阈值,请参阅源代码
    matplotlib/lib/matplotlib/ticker.py
  • 当打印轴跨度超过50年(未记录,但请参见源代码)时,matplotlib v2默认仅在(2,4,6,8)处绘制次刻度。这指定了次刻度的完整范围
  • 每隔一个x轴标签关闭一次,请参见例如