移除每个y轴子图的第一个和最后一个刻度标签

8
为了创建5个子图,我使用了以下方法:
`ax = plt.subplots(5, sharex=True)`

接下来,我想要移除每个 y 轴子图的第一个和最后一个标签刻度(因为它们会重叠),我使用了:

`plt.setp([a.get_yticklabels()[0::-1] for a in ax[0:5]], visible=False)`

但这只是去掉了一些勾号,我不理解其背后的逻辑。
4个回答

22

你应该小心处理第一次调用的结果。你可能想要这样调用它

fig, ax = plt.subplots(5, sharex=True, squeeze=True)

如果你这样做,那么你只需要迭代遍历所有的轴:

for a in ax:
    # get all the labels of this axis
    labels = a.get_yticklabels()
    # remove the first and the last labels
    labels[0] = labels[-1] = ""
    # set these new labels
    a.set_yticklabels(labels)

如果你想保持隐藏标签的风格,你可以使用

for a in ax:
    plt.setp(a.get_yticklabels()[0], visible=False)    
    plt.setp(a.get_yticklabels()[-1], visible=False)
注意:在访问刻度标签之前,您可能需要调用draw()方法(参见:https://dev59.com/J9ej0ogBFxS5KdRj-Ik7#41131528)。例如,在绘制到PDF时,您必须在调用get_xticklabels()之前先调用plt.gcf().canvas.draw()

这不完全一样吗?但请记住,“a”是一个numpy.ndarray,因此不支持那些选项... - Py-ser
感谢 Py-ser 注意到 plt.subplots 的结果是元组,通常是一个 2D 数组。我在回复中加了一条注释。我的代码仍然与上面的代码不同,因为使用 [0::-1] 和使用 [0] 是相同的。因此,您只选择第一个标签。 - David Zwicker
labels = ax.get_yticklabels() 可以放在循环外面吗?还是 ax 打错了应该是 a?或者是在循环过程中 ax.get_yticklabels() 会发生变化? - knia

6
使用 MaxNLocator
from matplotlib.ticker import MaxNLocator
ax.yaxis.set_major_locator(MaxNLocator(prune='both'))

3
另一种选择是使用x_ticks[0].label1.set_visible,如下所示。
import matplotlib
matplotlib.use('Agg')
import pylab
from  matplotlib import rc
rc('font', **{'family': 'sans-serif', 'sans-serif': ['Times-Roman']})
rc('text', usetex = True)
matplotlib.rcParams['text.latex.preamble'] = [r"\usepackage{amsmath}"]

figure, axs = matplotlib.pyplot.subplots(5, sharex = True, squeeze = True)
x_ticks = axs[4].xaxis.get_major_ticks()
x_ticks[0].label1.set_visible(False) ## set first x tick label invisible
x_ticks[-1].label1.set_visible(False) ## set last x tick label invisible
pylab.tight_layout()
pylab.savefig('./test.png', dpi = 200)

你会得到以下内容

invisible axis tick label


0

这不会返回你期望的结果:

>>> some_list = [1, 2, 3, 4]
>>> some_list[0::-1]
[1]  # and not [1, 4] !

使用切片符号返回一个列表,其中包含some_list的项,从示例中的位置0开始递减。这在第一步之后停止...

我认为你需要像@DavidZwicker所示的那样分两步来完成。


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