【问题标题】:Remove specific ticks on logarithmic plot in matplotlib删除 matplotlib 中对数图上的特定刻度
【发布时间】:2016-03-17 15:07:40
【问题描述】:

如果绘图是对数的,如何删除绘图的第一个和最后一个刻度标签?

经典例子:

import matplotlib.pyplot as plt
import numpy as np

ax1 = plt.subplot(1, 3, 1)
x = np.logspace(-3,1,100)
plt.plot(x,np.random.random(size=100))
plt.xscale('log')
ax2 = plt.subplot(1, 3, 2, sharey = ax1)
plt.plot(x,np.random.random(size=100))
plt.tick_params(axis='y',labelleft='off')
plt.subplots_adjust(wspace=0)

导致 x 轴上的标签重叠。

现在,如果我通过*_ticklabels 做最直接的事情,例如,

l = [""] + [i.get_text() for i in ax2.get_xticklabels()[1:-1]] + [""]
ax2.set_xticklabels(l)

它不起作用(在脚本中,如果 matplotlib 先绘制绘图则不起作用)。

我发现的一种方法是使用自定义代码对象。例如

from matplotlib.ticker import ScalarFormatter
class _MyTickFormatter(ScalarFormatter):
    def __init__(self, hide):
        self.hide = hide
        super(self.__class__, self).__init__()        

    def __call__(self, x, pos=None):
        N = len(self.locs)
        hide = [ N + i if i < 0 else i for i in self.hide ]

        if pos in hide:
            return ''
        else:
            return self.pprint_val(x)

有了这个就可以简单的做到ax2.set_major_formatter(_MyTickFormatter([0,-1]))

但是,如果 x 轴是对数的(如上)。然后解决方案需要另一个自定义的 tickformatter...

另一种可能性是使用MaxNLocator,如in this answer by Bernie 所述。但是,在对数轴上使用它只会让我打勾(因为它应该使用LogLocator,我假设)。

有什么想法可以解决这个难题吗?

【问题讨论】:

    标签: python matplotlib plot


    【解决方案1】:

    尝试以下方法:

        xticks = ax.xaxis.get_major_ticks()
        xticks[0].label1.set_visible(False)
        xticks[-1].label1.set_visible(False)
    

    它应该删除第一个和最后一个。

    【讨论】:

    • 这似乎不适用于脚本和对数轴,但前提是 matplotlib 先绘制图形。请参阅我上面关于set_xticklabels 的段落。我将更新我的问题以使其更清楚。
    • 这很奇怪。我不希望厚的行为会根据规模的类型而改变。我想到的唯一解决方案是您不要放置“对数”刻度并自己选择刻度位置(ax.set_xticks(positions))来模仿相同的行为。这能解决您的问题吗?
    • hm...不,因为我正在寻找一种可用于各种情节的自动化方式。也许别人有更好的主意。我认为它必须与 tickformatter 或 ticklocator 类一起使用。
    • 好的,我发现了问题。在“日志”轴中,第一个和最后一个刻度默认标记为空?
    【解决方案2】:

    正如user1834164 评论的那样,“在'log'轴中,第一个和最后一个刻度默认标记为空”。

    x = np.linspace(0,10,100)
    y = np.exp(x)
    plot(x,y)
    yscale('log')
    gca().yaxis.get_major_ticks()[-2].label1.set_visible(False)
    gca().yaxis.get_major_ticks()[1].label1.set_visible(False)
    

    所以只需将索引从 0 更改为 1,从 -1 更改为 -2,armatita 的答案就可以了。

    【讨论】:

      【解决方案3】:

      这不会解决您的问题,但希望它对您有所帮助。您可以尝试旋转刻度标签。在处理长重叠的 x 标签时,我发现这非常有用。在设置 x-ticks 时将rotate=45 作为一个 kwarg,或者稍后使用例如

      for tick in ax.get_xticklabels():
          tick.set_rotation(45)
      

      【讨论】:

        猜你喜欢
        • 2013-10-30
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2013-02-21
        相关资源
        最近更新 更多