2

我正在尝试在 Matplotlib 中制作一个涵盖数十年的对数图。但是,返回给我的默认 x 轴刻度远非理想,因为它们一次覆盖 20 个刻度,中间只有 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 中的附加功能。

4

1 回答 1

2

似乎在 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 轴标签,参见例如这个答案
于 2017-03-27T20:22:02.247 回答