Matplotlib 3D缩放问题

1 投票
1 回答
41 浏览
提问于 2025-04-14 17:39

我想问一下关于基本的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 时的输出:

这里输入图片描述

撰写回答