ChatGPT解决这个技术问题 Extra ChatGPT

在 matplotlib 图中隐藏轴文本

我正在尝试在任一轴上绘制一个没有刻度线或数字的图形(我使用传统意义上的轴,而不是 matplotlib 命名法!)。我遇到的一个问题是 matplotlib 通过减去值 N 来调整 x(y)ticklabels,然后在轴的末端添加 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()

我想知道的三件事是:

首先如何关闭此行为(尽管在大多数情况下它很有用,但并非总是如此!)我查看了 matplotlib.axis.XAxis 并找不到任何合适的东西如何使 N 消失(即 X.set_visible (错误))有没有更好的方法来完成上述操作?如果相关的话,我的最终图将是图中的 4x4 子图。

我有点怀疑这里的任何答案是否真的回答了这个问题。在我看来,这个问题似乎是在问如何get rid of the offset。然而,所有答案都显示了如何摆脱 all 刻度标签的各种方法。如果问题已被答案取代,也许应该编辑问题以询问答案提供的解决方案是什么?

J
John Difool

您可以隐藏整个轴,而不是隐藏每个元素:

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() 向坐标区添加标签。


嘿 Ofri - 太好了,谢谢,但是现在(只是尴尬)如果我想添加一个 xlabel() 会发生什么?除了手动放置文本小部件。
如何将此示例扩展到 3d? ax = plt.gca(projection='3d'), ax.axes.get_zaxis().set_visible(False) 给出 'Axes3DSubplot' object has no attribute 'get_zaxis'
这个答案不允许显示网格线。 @saullo castro 的回答虽然...
问题是当 x_axis 设置为不可见时,网格 dsappears :( 编辑:刚刚看到@Saullo Castro 的回答解决了这个问题。
@user989762 在您的情况下,此方法行不通,甚至 get_xaxis().set_visible(False) 也行不通。我认为 matplotlib 在这种情况下会初始化一些参数,就好像绘图是 2D 一样。 ax.set_zticks([]) 会做你想做的事
S
Saullo G. P. Castro

如果您只想隐藏保持网格线的轴文本:

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

执行 set_visible(False)set_ticks([]) 也会隐藏网格线。


这将删除共享该轴的所有子图的标签:/
É
Ébe Isaac

如果您像我一样并且在绘制图形时并不总是检索坐标轴ax,那么一个简单的解决方案就是

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

G
G M

我已经对这个数字进行了颜色编码以简化过程。

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)

https://i.stack.imgur.com/NffEZ.png

您可以使用这些命令完全控制图形,以完成答案,我还添加了对样条线的控制:

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)

ax.set_xticklabels([])ax.set_xticks([]) 对我不起作用,但 ax.axes.get_xaxis().set_visible(False) 对我有用。
ax.axes.get_xaxis().set_visible(False) 也隐藏了我的 ax.set(xlabel='example'),但同时使用 ax.set_xticklabels([])ax.set_xticks([]) 没有。
u
user

我实际上无法根据此处的任何代码片段(甚至是答案中接受的代码片段)渲染没有边框或轴数据的图像。在浏览了一些 API 文档后,我找到了这段代码来渲染我的图像

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

我使用 tick_params 调用基本上关闭了可能呈现的任何额外信息,并且我的输出文件中有一个完美的图表。


当轴被共享时,基于 set_ticklabels 的解决方案在共享轴上传播。只有这个基于 tick_params 的解决方案对我来说效果很好。
plt.tick_params 需要 bool 而不是字符串。所以 'off'' 实际上计算为 True,因此与直觉相反,该命令实际上显示了刻度和标签。我没有发现任何信息,因为这是什么时候出现的行为。
R
Rafa Viotti

有点旧线程但是,这似乎是使用最新版本的 matplotlib 的更快方法:

设置 x 轴的主要格式化程序

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

如果你只想做一个滴答声怎么办?
是的,这对于仅隐藏标签很有用,因为 .set_xticks([]) 也会删除刻度线本身。
V
Venkatachalam

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

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

或者更概括地说(@Armin Okić),您可以将其设置为 "None"


我发现这个解决方案比其他解决方案更简单,同时我会添加颜色可以设置为“无”,以便不依赖于背景颜色。
我注意到这应该是字符串“None”,而不是 Python 文字 None。后者抛出异常
S
Steven C. Howell

使用面向对象的 API 时,Axes 对象有两个有用的方法来删除轴文本,set_xticklabels()set_xticks()

假设您使用

fig, ax = plt.subplots(1)
ax.plot(x, y)

如果您只是想删除刻度标签,您可以使用

ax.set_xticklabels([])

或完全去除蜱虫,你可以使用

ax.set_xticks([])

这些方法可用于准确指定刻度的位置以及标记的方式。传递一个空列表会分别导致没有刻度或没有标签。


T
Thiago Petrone

您可以简单地将 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()