三维图中坐标轴的等比例缩放

3

我正在使用Axes3D绘制一组三维坐标(x,y,z)。我的代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x,y,z=data[::1,0],data[::1,1],data[::1,2]
fig=plt.figure(figsize=(10,10))
ax=fig.add_subplot(111,projection='3d')
ax.scatter(x,y,z,s=0.1,c=z,cmap='hot',marker='+')
plt.show()

我希望三个轴具有相同的比例缩放。现在问题是数据具有大的纵横比,也就是说,x和y坐标的变化约为z坐标的10倍。如果我放置

mi=np.min(data)
ma=np.max(data)    
ax.set_xlim(mi,ma)
ax.set_ylim(mi,ma)
ax.set_zlim(mi,ma)

这将导致轴坐标在各个方向上都是均匀缩放的,但会浪费很多z方向上的空间。我该如何避免这种情况并仍然获得均匀缩放的轴坐标呢?


你想让你的坐标轴具有相同的比例尺吗?还是想要它们的大小相同? - nicoguaro
我希望它们具有相同的比例。然后,由于我的数据分布不均匀,我不想在图中浪费空间,因此我将拥有长度非常不同的轴。 - phlegmax
1个回答

2

在stackoverflow中有一个类似的问题,但是我找不到它。因此,我附上一些代码,这是我理解你的问题的部分(可扩展性不是我编写的,而是来自我提到的那个其他帖子)。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

data =np.random.rand(100,3)

x,y,z= 10*data[:,0], 20*data[:,1], 5*data[:,2]
fig=plt.figure(figsize=(10,10))
ax=fig.add_subplot(111,projection='3d')
ax.scatter(x,y,z)

# Fix aspect ratio
max_range = np.array([x.max()-x.min(), y.max()-y.min(),
                      z.max()-z.min()]).max() / 2.0
mean_x = x.mean()
mean_y = y.mean()
mean_z = z.mean()
ax.set_xlim(mean_x - max_range, mean_x + max_range)
ax.set_ylim(mean_y - max_range, mean_y + max_range)
ax.set_zlim(mean_z - max_range, mean_z + max_range)

plt.show()

以下是结果:

在此输入图片描述


很遗憾,这不是我想要的。这种方式会得到一个立方体图形,也就是说,所有轴的长度都相同。然而,我希望三个轴具有相同的比例尺度,也就是说,我希望绘图背景中的小瓷砖是立方体的(就像你的示例中一样),但另一方面,我希望每个轴的长度不超过绘制数据所需的长度。在你的示例中,我只希望z轴的范围从-3到7。 - phlegmax
哦,好的,下次你可以添加一个你想要的图。抱歉,我不知道如何做你想要的事情。我认为没有简单的方法,因为mplot3d中有一些硬编码的东西。我建议你在matplotlib的邮件列表或gitter聊天室中询问。 - nicoguaro

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