Matplotlib绘图中如何隐藏坐标轴文本

544

我想绘制一个图形,但是不希望在任一轴上有刻度线或数字(我使用传统含义中的坐标轴,而不是matplotlib的命名方式!)。我遇到的问题是matplotlib通过减去一个值N来调整x(y)刻度标签,然后在轴末添加N。

下面是一个简化的示例,突出了这个问题,其中“6.18”是N的有问题的值:

import matplotlib.pyplot as plt
import random
prefix = 6.18

rx = [prefix+(0.001*random.random()) for i in arange(100)]
ry = [prefix+(0.001*random.random()) for i in arange(100)]
plt.plot(rx,ry,'ko')

frame1 = plt.gca()
for xlabel_i in frame1.axes.get_xticklabels():
    xlabel_i.set_visible(False)
    xlabel_i.set_fontsize(0.0)
for xlabel_i in frame1.axes.get_yticklabels():
    xlabel_i.set_fontsize(0.0)
    xlabel_i.set_visible(False)
for tick in frame1.axes.get_xticklines():
    tick.set_visible(False)
for tick in frame1.axes.get_yticklines():
    tick.set_visible(False)

plt.show()

我想知道的三件事是:

  1. 如何在首次关闭此行为(虽然在大多数情况下它很有用,但并非总是!)我已经查看了matplotlib.axis.XAxis,但找不到合适的内容。

  2. 如何使N消失(即X.set_visible(False))。

  3. 是否有更好的方法来完成上述操作?如果相关,我的最终图将是一个4x4的子图。


我有一点疑问,是否这里的任何答案都真正回答了问题。对我来说,问题似乎是在问如何默认情况下去除偏移量。然而,所有的答案都展示了各种方法如何去除所有刻度标签。如果问题已经被回答,也许应该编辑问题以寻求答案提供的解决方案? - ImportanceOfBeingErnest
12个回答

662

不必隐藏每个元素,可以隐藏整个坐标轴:

frame1.axes.get_xaxis().set_visible(False)
frame1.axes.get_yaxis().set_visible(False)

或者,你可以将刻度设置为一个空列表:

frame1.axes.get_xaxis().set_ticks([])
frame1.axes.get_yaxis().set_ticks([])

在第二种选项中,您仍然可以使用plt.xlabel()plt.ylabel()为坐标轴添加标签。


300

如果您只想隐藏坐标轴文本而保留网格线:

frame1 = plt.gca()
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])

使用set_visible(False)或者set_ticks([])也会隐藏网格线。


223

如果您和我一样,不总是在绘制图形时检索轴ax,那么一个简单的解决方案就是执行

plt.xticks([])
plt.yticks([])

4
我只需使用 plt.axis('off') 就可以一站式完成。 - eric
3
这也会删除网格线(如果有的话)。 - Michel de Ruiter

148
我已经用颜色编码这个图表以便于操作。
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)

enter image description here

使用这些命令,您可以完全控制图形,为了完整回答,我还添加了对轴线的控制:

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# X AXIS -BORDER
ax.spines['bottom'].set_visible(False)
# BLUE
ax.set_xticklabels([])
# RED
ax.set_xticks([])
# RED AND BLUE TOGETHER
ax.axes.get_xaxis().set_visible(False)

# Y AXIS -BORDER
ax.spines['left'].set_visible(False)
# YELLOW
ax.set_yticklabels([])
# GREEN
ax.set_yticks([])
# YELLOW AND GREEN TOGHETHER
ax.axes.get_yaxis().set_visible(False)

99

实际上,我无法根据这里的任何代码片段(即使是所接受的答案)呈现没有边框或坐标轴数据的图像。在查阅一些API文档后,我最终采用了这段代码来呈现我的图像。

plt.axis('off')
plt.tick_params(axis='both', left=False, top=False, right=False, bottom=False, labelleft=False, labeltop=False, labelright=False, labelbottom=False)
plt.savefig('foo.png', dpi=100, bbox_inches='tight', pad_inches=0.0)

我使用了 tick_params 方法来关闭任何可能被渲染的额外信息,这样我在输出文件中得到了一个完美的图形。


68

虽然这是一个有点老的帖子,但使用最新版本的matplotlib似乎可以更快地实现以下方法:

为x轴设置主要格式化程序。

ax.xaxis.set_major_formatter(plt.NullFormatter())

该方法还可以保持刻度和网格不变。 - Roux

17

一个技巧是将刻度标签的颜色设置为白色以隐藏它!

plt.xticks(color='w')
plt.yticks(color='w')

或者更加通用地说(@Armin Okić),你可以将其设置为"None"


16
当使用面向对象的API时,Axes 对象有两个有用的方法可用于去除轴文本,分别是 set_xticklabels()set_xticks()
比如说你创建了一个图形:
fig, ax = plt.subplots(1)
ax.plot(x, y)

如果你仅仅想要移除刻度标签,你可以使用:

ax.set_xticklabels([])

要完全消除这些蜱虫,您可以使用

ax.set_xticks([])

这些方法可用于精确指定刻度的位置和标签方式。传递空列表会导致没有刻度或无标签。


4
你可以直接在坐标轴中将xlabel设置为None。以下是使用seaborn的一个工作示例。
from matplotlib import pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")

ax = sns.boxplot(x="day", y="total_bill", data=tips)
ax.set(xlabel=None)

plt.show()

2

如果你有子图的话,只需要这样做

fig, axs = plt.subplots(1, 2, figsize=(16, 8))

ax[0].set_yticklabels([]) # x-axis
ax[0].set_xticklabels([]) # y-axis

轴注释反了,但其他方面它是有效的。 - Alex Poca

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