Matplotlib 子图——完全摆脱刻度标签

Posted

技术标签:

【中文标题】Matplotlib 子图——完全摆脱刻度标签【英文标题】:Matplotlib Subplots -- Get Rid of Tick Labels Altogether 【发布时间】:2014-09-27 05:58:57 【问题描述】:

在 Matplotlib 中创建子图数组时,有没有办法完全摆脱刻度标签?我目前需要根据绘图对应的较大数据集的行和列来指定每个绘图。我尝试使用 ax.set_xticks([]) 和类似的 y 轴命令,但无济于事。

我知道想要绘制一个没有任何轴数据的绘图可能是一个不寻常的请求,但这正是我所需要的。我需要它自动应用于数组中的所有子图。

【问题讨论】:

Remove xticks in a matplot lib plot? 的可能重复项 @Ben,我在搜索中遇到了这个问题。这对我的情况没有帮助。我不确定为什么。我对编程很陌生,我不确定是因为我有多个子图还是什么。 没有建议我的问题状态为重复,有没有人建议尝试一些事情? (很抱歉听起来很沮丧,但此时在这里发帖有点像万岁玛丽。) Hiding axis text in matplotlib plots的可能重复 【参考方案1】:

你有正确的方法。也许您没有将set_xticks 应用于正确的轴。

一个例子:

import matplotlib.pyplot as plt
import numpy as np

ncols = 5
nrows = 3

# create the plots
fig = plt.figure()
axes = [ fig.add_subplot(nrows, ncols, r * ncols + c) for r in range(0, nrows) for c in range(0, ncols) ]

# add some data
for ax in axes:
    ax.plot(np.random.random(10), np.random.random(10), '.')

# remove the x and y ticks
for ax in axes:
    ax.set_xticks([])
    ax.set_yticks([])

这给出了:

请注意,每个轴实例都存储在一个列表中 (axes),然后可以轻松地对其进行操作。像往常一样,有几种方法可以做到这一点,这只是一个例子。

【讨论】:

单行是plt.setp(axes, xticks=[], yticks=[]) 您也可以使用NullFormatter 我认为这些响应的某种组合对我有用!非常感谢。 +1 用于带有可测试代码的两个详细响应。 :) 编辑:为了确保这个答案运行没有错误,我相信你应该在索引子图创建时添加+1axes = [ fig.add_subplot(nrows, ncols, r * ncols + c + 1) for r in range(0, nrows) for c in range(0, ncols) ] 我不确定 matplotlib 的哪个版本,但是轴上的简单 for 循环将不再起作用,因为如果列和行都不是,它们现在存储为二维数组1. 记住一点。【参考方案2】:

子图的命令相同

fig = plt.figure()

ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)

ax1.plot([1,2])

ax1.tick_params(
    axis='x',          # changes apply to the x-axis
    which='both',      # both major and minor ticks are affected
    bottom='off',      # ticks along the bottom edge are off
    top='off',         # ticks along the top edge are off
    labelbottom='off'  # labels along the bottom edge are off)
)

plt.draw()

【讨论】:

这比公认的答案更好,因为它保留了您拥有的任何网格。接受的答案还将删除您使用的任何 x-grid。例如。当使用样式 ggplot【参考方案3】:

比@DrV 的答案更简洁,重新混合@mwaskom 的评论,一个完整的、完全的单线来摆脱所有子图中的所有轴:

# do some plotting...
plt.subplot(121),plt.imshow(image1)
plt.subplot(122),plt.imshow(image2)
# ....

# one liner to remove *all axes in all subplots*
plt.setp(plt.gcf().get_axes(), xticks=[], yticks=[]);

注意:必须在调用 plt.show() 之前调用它

【讨论】:

@Roy 这个选项很棒,但它也消除了蜱虫。是否可以只删除标签并保留刻度? (我有太多的子图,所以如果有一个选项可以解决这个问题而无需再次遍历每个子图,那就太好了【参考方案4】:

您只需运行以下代码即可摆脱默认的子图 x 和 y 刻度:

fig, ax = plt.subplots()
ax.xaxis.set_major_locator(plt.NullLocator())
ax.yaxis.set_major_locator(plt.NullLocator())
for i in range(3):
    ax = fig.add_subplot(3, 1, i+1)
    ...

只需在fig, ax = plt.subplots() 之后添加上述两行,您就可以删除默认刻度。

【讨论】:

以上是关于Matplotlib 子图——完全摆脱刻度标签的主要内容,如果未能解决你的问题,请参考以下文章

删除 Matplotlib,Python 中某些子图的 y 轴刻度标签

Matplotlib:指定刻度标签的浮点格式

Matplotlib 在所有子图上显示 x-ticks 和唯一的 y 标签

如何更改 matplotlib 中轴对象刻度的字体大小 [重复]

在 Matplotlib 中清除子图

整数刻度标签 matplotlib,没有原点刻度标签