Matplotlib 3D缩放问题
我想问一下关于基本的matplotlib 3D绘图工具的问题。现在,我先做一些假数据来说明我的问题:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 1000)
y = x
X, Y = np.meshgrid(x, y)
f = np.exp(-(X**2 / 0.5) - Y**2 / 0.5)
我有一堆图想要并排放置,因为它们是由一个参数连接的,这里我只是重复使用相同的数据,因为这对我的问题影响不大。所以我基本的图看起来是这样的:
fig, ax = plt.subplots(1, 1, subplot_kw={"projection": "3d"})
for i in range(5):
ax.contourf(x, y, f, zdir="z", offset=i)
ax.view_init(elev=15, azim=45, roll=-90)
ax.set_zlim3d(-0.5, 3.5)
ax.set_box_aspect((3, 3, 7), zoom=1)
我在旁边看到一个不错的图:
现在,由于这个图最终会被放入一个更大的图中,我试着减少它周围的空白区域。这个问题在matplotlib出现以来就一直存在,遗憾的是我没有找到简单的解决办法,改变宽高比有助于更好地填充空间。现在我的问题是:如果我尝试放大,也就是把
ax.set_box_aspect((3, 3, 7), zoom=1)
改成 ax.set_box_aspect((3, 3, 7), zoom=2)
:
图只显示在中间。尽管从美观上讲,这个放大比例太大了,但我还是搞不懂为什么应该在z=3的图不显示,而z=0的图被切掉了。我不能添加视频,但如果我尝试使用拖动缩放工具,我可以看到我的数据只会显示在图的中心(当前图被切掉的地方),任何尝试移动它的操作都会导致类似的结果:只有3D坐标轴的中心显示数据。
现在我在想:为什么会这样?这是因为matplotlib中3D坐标轴的实现吗?有没有什么原因让它被这样编写?我能做些什么来解决这个问题吗?
谢谢。
1 个回答
1
试着把图形做得大一点(比如可以设置为 (12, 6)
之类的),然后把每个填充轮廓的裁剪设置为 False
:
# your code
fig, ax = plt.subplots(1, 1, figsize=(12, 6), subplot_kw={"projection": "3d"})
# your code
for i in range(5):
c = ax.contourf(x, y, f, zdir="z", offset=i, cmap=plt.cm.coolwarm)
c.set_clip_on(False)
# your code
当 zoom=1
时的输出:
当 zoom=2
时的输出: