matplotlib:仅在主要x轴上显示次要刻度标签

4
我有一个通用的绘图类,使用matplotlib生成(png)图,可能有多个y轴,但始终只有一个(共享的)x轴显示日期。
这是处理x轴标签格式的方法:
def format_xaxis(self, axis, primary):
    steps = (1,2,3,4,6,12)
    step = steps[min(len(self.dates) // 1000, 5)]
    axis.set_axisbelow(True)
    axis.xaxis.grid(b=True, which='minor', color='0.90', linewidth=0.5)
    axis.xaxis.set_minor_locator(MonthLocator(bymonth=range(1,13,step)))
    axis.xaxis.set_major_locator(YearLocator())
    if primary:
        axis.xaxis.set_major_formatter(DateFormatter(fmt='%b %y'))
        axis.xaxis.set_minor_formatter(DateFormatter(fmt='%b'))
    else:
        plt.setp(axis.get_xticklabels(), visible=False)

使用以下输入:

  • primary是一个布尔值,表示这是否是主轴
  • axis是一个matplotlib轴实例

我想要的(并且期望从上述方法中得到的结果)是只有主轴有标签,并且主标签是月份-年份,次标签是仅月份。

但实际发生的是,只有主标签显示在主轴上,次标签根本没有显示。

如果我将最后6行更改为:

    axis.xaxis.set_major_locator(YearLocator())
    axis.xaxis.set_major_formatter(DateFormatter(fmt='%b %y'))
    axis.xaxis.set_minor_formatter(DateFormatter(fmt='%b'))
    if not primary:
        plt.setp(axis.get_xticklabels(), visible=False)

然后在所有轴上显示次要标签。

我该如何只在主要x轴上显示次要x轴刻度标签?

编辑:

使用KevinG第二个代码块中的建议可行:

    axis.xaxis.set_major_locator(YearLocator())
    axis.xaxis.set_major_formatter(DateFormatter(fmt='%b %y'))
    axis.xaxis.set_minor_formatter(DateFormatter(fmt='%b'))
    if not primary:
        plt.setp(axis.get_xticklabels(minor=False), visible=False)
        plt.setp(axis.get_xticklabels(minor=True), visible=False)
1个回答

3

我注意到很多的刻度标签默认参数都是minor=False。如果你正好手头没有多重轴图,我建议你去看一下那里。我想应该会有类似这样的:

if primary:
    axis.xaxis.set_major_formatter(DateFormatter(fmt='%b %y'))
    axis.xaxis.set_minor_formatter(DateFormatter(fmt='%b'))
    plt.setp(axis.get_xticklabels(minor=True), visible=True)
else:
    plt.setp(axis.get_xticklabels(), visible=False)

应该会产生一些影响。


谢谢KevinG。你的代码不能直接使用,但是你的建议还是帮了我大忙,因为我将它应用到我的替代代码上了(请参见上面的编辑)。 - John Peters
很高兴我能帮忙。但是,那个解决方案的逻辑有些让我不爽...它似乎会为所有xaxis打开次要xaxis标签,除了主要的...如果你的所有xaxis都是相同的并且重叠的(这一定是你的情况!),那么这没问题,但如果你只有一个xaxis,并且它被标记为主要的,或者每个xaxis的位置不同,那么它就会出问题。 - KevinG
你说得对,我的所有x轴都是相同的。我没有测试过,但如果只有一个主轴,它也应该可以工作 - 在这种情况下,visible=False行不会被执行(这是正确的)。 - John Peters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接