如何隐藏3D图的一个坐标轴?

40

如何制作一个不显示坐标轴的3D图形?

当绘制3D图形时,Matplotlib不仅会绘制x、y和z轴,还会在x-y、y-z和x-z平面上绘制浅灰色网格。我想绘制一个“自由浮动”的3D图形,没有这些元素。

我尝试过的方法:

# Doesn't work; this hides the plot, not the axes
my_3d_axes.set_visible(False)

# Doesn't do anything. Also, there's no get_zaxis() function.
my_3d_axes.get_xaxis().set_visible(False)
my_3d_axes.get_yaxis().set_visible(False)

你之前尝试的方法曾经是有效的。但不幸的是,我不确定现在是否还有简单的方法来做到这一点...希望仍然存在! - Joe Kington
对于另外三个,您需要使用 ax.w_xaxisax.w_yaxisax.w_zaxis。然而,将它们设置为不可见并不能解决问题。 - Joe Kington
我明白了。不管怎样,知道这个信息还是很好的;谢谢。 - SuperElectric
看起来Ben Root已经在用户列表上回答了你的问题。(ax.set_axis_off()) 很高兴知道有一种简单的方法!实际上,我模糊地记得曾经回答过一个关于这个问题的问题...也许那就是我记得工作的东西,而不是ax.set_visible(False) - Joe Kington
2
显然,我知道在某个时候。我的记忆力很差。https://dev59.com/C1DTa4cB1Zd3GeqPJ4mJ#3736072 看起来在matplotlib 1.0.1中不再起作用...这可能值得报告为一个bug。 - Joe Kington
显示剩余2条评论
2个回答

37

Ben Root提供了一个补丁,用于修复1.0.1版本中的问题。您可以在此线程的最后一封电子邮件中找到它作为附件。引用Ben的话:

好的,看起来隐藏3D轴是在v1.0发布之后(但在我开始处理mplot3d之前)添加的功能。这个补丁应该能够启用基本功能,而不会干扰现有的函数。如果要隐藏轴,您需要将私有成员"_axis3don"设置为False,如下所示:

ax = plt.gca(projection='3d') ax._axis3don = False

如果您按照这种方式操作,那么您现在就可以得到想要的结果,并且您的代码仍然与升级后的mplot3d兼容(虽然首选方法是调用set_axis_on()或set_axis_off())。

希望这可以帮到你!

Ben Root


39
现在支持 ax.set_axis_off()set_axis_on()(1.4.1)。 - user989762
似乎将轴设置为关闭也会隐藏这些轴的平面。您是否知道一种解决方案,可以隐藏轴线但保留平面以保持透视? - Alexis.Rolland
@Alexis.Rolland ax.setxticklabels([]) 几乎可以实现你想要的效果。它不会隐藏轴本身,但是标签会被隐藏,因此平面仍然可见。 - rolly
1
属性错误:'Axes3DSubplot'对象没有属性'setxticklabels'。 - KeithB
应该是 ax.set_xticklabels([]) - Scott

8

ax.set_axis_off()

这是一个具体而直接的例子,与在https://dev59.com/DGs05IYBdhLWcg3wR_63#7363931提到的内容相关。

#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
import mpl_toolkits.mplot3d.art3d as art3d

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_axis_off()

# Draw a circle on the x=0 'wall'
p = Circle((0, 0), 1, fill=False)
ax.add_patch(p)
art3d.pathpatch_2d_to_3d(p, zdir="x")
p = Circle((0, 0), 1, fill=False)
ax.add_patch(p)
art3d.pathpatch_2d_to_3d(p, zdir="z")

ax.set_xlim(-1.2, 1.2)
ax.set_ylim(-1.2, 1.2)
ax.set_zlim(-1.2, 1.2)

plt.savefig('main.png', format='png', bbox_inches='tight')

输出:

enter image description here

如果没有使用 ax.set_axis_off(),则会像这样:

enter image description here

但是你会注意到,这会在图形周围产生过多的空白边距,因为它仅隐藏了轴,但并未更改视口。我尝试了 bbox_inches ='tight'在2D中的帮助,但无济于事。如何解决该问题,请参见:删除Axes3d(matplotlib)中的空白空间

在 matplotlib==3.2.2 上测试通过。


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