Matplotlib:在对数图中奇怪的双十年轴蜱

时间:2016-10-28 18:30:35

标签: python matplotlib plot axis-labels loglog

我正在尝试制作一个在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')

返回给我的图片如下所示:

enter image description here

如您所见,主要的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中的其他功能。

1 个答案:

答案 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个小蜱,每个其他主要蜱都有轴标签。但由于我刚刚发布了一个帐户来发布这个答案,我没有足够的声誉来分享相应的图像:(。

每个标记行的一些细节(参见上面代码中的编号注释):

  1. 增加允许的刻度线的最大数量。值15是v1的阈值,请参阅matplotlib/lib/matplotlib/ticker.py的源代码。
  2. 当绘图轴跨越超过5年(未记录,但参见源代码)时,matplotlib v2默认仅绘制(2,4,6,8)次要刻度。这指定了小范围的全部范围。
  3. 关闭所有其他x轴标签,例如this answer