【问题标题】:Matplotlib: strange double-decade axis ticks in log plotMatplotlib:日志图中奇怪的双十年轴刻度
【发布时间】:2017-03-11 16:56:40
【问题描述】:

我正在尝试在 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 中提供的附加功能。

【问题讨论】:

    标签: python matplotlib plot axis-labels loglog


    【解决方案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 个次要刻度,以及每隔一个主要刻度的轴标签。但是由于我刚刚注册了一个帐户来发布此答案,因此我没有足够的声誉来分享相应的图片:(。

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 2014-05-14
      • 2021-03-06
      • 2020-10-01
      • 2021-04-03
      • 2020-04-27
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多