【问题标题】:Uniformly scaled axes in 3d plot with python matplotlib使用 python matplotlib 在 3d 图中统一缩放轴
【发布时间】:2015-03-17 08:43:43
【问题描述】:

我正在使用 Axes3D 绘制一组 3d 坐标 (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 方向浪费大量空间。我怎样才能避免这种情况并获得统一缩放的轴?

【问题讨论】:

  • 您希望您的坐标区具有相同的刻度吗?还是一样大?
  • 我希望它们具有相同的比例。然后,由于我有非均匀分布的数据并且不想在图中浪费空间,所以我将拥有长度非常不同的轴。

标签: python matplotlib plot


【解决方案1】:

SO 中有一个类似的问题……但我找不到。所以我附上了一些我理解的代码是你的问题(缩放的部分不是我的,而是来自我提到的其他帖子)

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。
  • 哦,好的,下次你可以添加你想要的情节。对不起,我不知道该怎么做。我认为这不是一个简单的方法,因为mplot3d 中有些东西是硬编码的。建议你在matplotlib的邮件列表或gitter chat中询问。
猜你喜欢
  • 2010-09-28
  • 2021-05-28
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
相关资源
最近更新 更多