在 matplotlib 图中隐藏轴文本
- 2025-02-08 08:52:00
- admin 原创
- 47
问题描述:
我试图绘制一个在两个轴上都没有刻度标记或数字的图形(我使用传统意义上的轴,而不是 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()
我想知道三件事:
首先,如何关闭这种行为(尽管在大多数情况下它是有用的,但并非总是如此!)我已经查看过
matplotlib.axis.XAxis
,找不到任何合适的东西我怎样才能让 N 消失(即
X.set_visible(False)
)无论如何,有没有更好的方法来实现上述目标?如果相关的话,我的最终图将是图中的 4x4 子图。
解决方案 1:
您可以隐藏整个轴,而不必隐藏每个元素:
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()
向轴添加标签。
解决方案 2:
如果您只想隐藏轴文本而保留网格线:
frame1 = plt.gca()
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])
执行set_visible(False)
或set_ticks([])
也将隐藏网格线。
解决方案 3:
如果你像我一样,在绘制图形时并不总是检索轴ax
,那么一个简单的解决方案就是
plt.xticks([])
plt.yticks([])
解决方案 4:
我已对这个图进行了颜色编码以简化这个过程。
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
您可以使用以下命令完全控制图形,为了完成答案,我还添加了对脊柱的控制:
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)
解决方案 5:
我实际上无法根据这里的任何代码片段(甚至是答案中接受的代码片段)渲染没有边框或轴数据的图像。在查阅了一些 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
调用基本上关闭了可能呈现的任何额外信息,并且在我的输出文件中有一个完美的图表。
解决方案 6:
有点像老线程,但是,使用最新版本的 matplotlib 似乎是一种更快的方法:
设置 x 轴的主要格式
ax.xaxis.set_major_formatter(plt.NullFormatter())
解决方案 7:
一个技巧是将刻度标签的颜色设置为白色以隐藏它!
plt.xticks(color='w')
plt.yticks(color='w')
或者更概括地说(@Armin Okić),您可以将其设置为"None"
。
解决方案 8:
当使用面向对象的 API 时,Axes
对象有两种用于删除轴文本的有用方法,set_xticklabels()
和set_xticks()
。
假设你使用以下方式创建绘图
fig, ax = plt.subplots(1)
ax.plot(x, y)
如果你只是想删除刻度标签,你可以使用
ax.set_xticklabels([])
或者要完全去除蜱虫,你可以使用
ax.set_xticks([])
这些方法可用于精确指定您想要的刻度位置以及您希望如何标记它们。传递空列表将分别导致没有刻度或没有标签。
解决方案 9:
你可以简单地将 设置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()
解决方案 10:
如果你有子情节的话就这么做
fig, axs = plt.subplots(1, 2, figsize=(16, 8))
ax[0].set_yticklabels([]) # x-axis
ax[0].set_xticklabels([]) # y-axis
解决方案 11:
如何让刻度标签保留但轴标签消失:
axs.xaxis.label.set_visible(False)
解决方案 12:
尝试使用以下代码行:
plt.axis("off")
应该可以帮您解决问题。
解决方案 13:
要保持刻度和网格线完整但隐藏刻度标签,请使用:
ax.xaxis.set_tick_params(labelcolor='none')
# Similar for the y axis.
这还有一个好处,即 Jupyter Notebook 交互式后端的鼠标悬停实用程序不受影响;大多数其他解决方案往往会导致鼠标悬停实用程序失效,即不显示绘图坐标。