我有一些代码可以使用matplotlib的scatter
和tight_layout
生成3D散点图,请参见下面的简化代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import proj3d
fig = plt.figure()
ax = fig.gca(projection='3d')
N = 100
x = np.random.random(N)
y = np.random.random(N)
z = np.random.random(N)
ax.scatter(x, y, z)
plt.tight_layout() # <-- Without this, everything is fine
plt.savefig('scatter.png')
类似的输出是由较旧的版本生成的,至少回溯到1.5.1。使用新版本3.0.0时,plt.tight_layout()
出问题了,我得到以下输出:
与此伴随的是警告
... / matplotlib / tight_layout.py:177:用户警告:左右边距不能足够大以容纳所有轴装饰
有人可能会争辩说,不带任何参数的tight_layout
会(无论是在较旧的matplotlibs上)还是不会始终导致预期的紧缩利润,因此应该避免将tight_layout
与3D绘图一起使用第一名。但是,通过手动调整tight_layout
的参数,即使在3D绘图上,这也是(过去)修剪边距的一种不错的方法。
我的猜测是这是matplotlib中的错误,但也许他们做了一些我没有意识到的有意更改。任何有关修复的指针表示赞赏。
答案 0 :(得分:2)
感谢ImportanceOfBeingErnest的评论,它现在可以工作:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import proj3d
fig = plt.figure()
ax = fig.gca(projection='3d')
N = 100
x = np.random.random(N)
y = np.random.random(N)
z = np.random.random(N)
ax.scatter(x, y, z)
# The fix
for spine in ax.spines.values():
spine.set_visible(False)
plt.tight_layout()
plt.savefig('scatter.png')
从注释中的链接看来,这将在matplotlib 3.0.x中修复。目前,可以使用上面的方法。
答案 1 :(得分:-2)
plt.tight_layout()
plt.show()
就在绘图主体代码的正下方。