删除matplotlib中对数图上的特定刻度

时间:2016-03-17 15:07:41

标签: python matplotlib plot

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

经典示例:

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 ...

另一种可能性是使用in this answer by Bernie所述的MaxNLocator。但是,在对数轴上使用它只留下一个刻度(因为它应该使用LogLocator,我假设。)

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

3 个答案:

答案 0 :(得分:3)

尝试以下方法:

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

它应该先删除。

答案 1 :(得分:1)

正如user1834164所评论的那样,“在'日志'轴中,第一个和最后一个勾号默认标记为空,似乎是”。

+ (NSString*)iso6709StringFromCLLocation:(CLLocation*)location
{
    //Comes in like
    //+39.9410-075.2040+007.371/
    //Goes out like
    //+39.9410-075.2040/
    if (location) {
        return [NSString stringWithFormat:@"%+08.4f%+09.4f/",
            location.coordinate.latitude,
            location.coordinate.longitude];
    } else {
        return nil;
    }
}

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

Figure, produced by the code above

答案 2 :(得分:0)

这不会解决你的问题,但无论如何它希望它能帮到你。您可以尝试旋转刻度标签。我发现这在处理长重叠的x标签时非常有用。您可以在设置x-ticks时将rotate=45设为kwarg,也可以稍后再使用

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