我正在尝试绘制3D球面组成的几何图形。 这些球有数以万计,每个球都有给定的坐标,半径和颜色。
我想在3D轴(mpl_toolkits.mplot3d.Axes3D
)上使用散点图,因为我没有找到一种更有效的3D方式。我也不能使用Mayavi
。
但是,我想按比例查看我的几何图形,这意味着这些球应具有xyz比例尺(米)中提供的半径。
经过一些研究,似乎我需要提供给scatter
的大小是pt ^ 2中的表面,其中1 pt = dpi / 72像素
然后,我需要创建一个新函数scatter2
,其中(磁盘或球体的表面,我不确定...)的单位为米^ 2,将其转换为像素^ 2,然后转换为pt ^ 2。
有人知道如何完成此仪表^ 2 =>像素^ 2吗?
此外,如果您有更好的解决方案(运行起来更简单和/或更快),我将很高兴听到它。
最后,即使使用scatter
,当我尝试旋转几何图形时,绘图也非常缓慢。正常吗我可以在代码中添加一些内容,以加速图形处理吗?
这是我现在的代码:
from random import random
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def scatter2(fig,ax,x,y,z,c,s_meters2):
s_pixels2 = [s_meters2[i]*1 for i in range(len(s_meters2))] # meters^2 => pixels^2,how to do?
s_pt2 = [s_pixels2[i]*fig.dpi/72 for i in range(len(s_pixels2))] # pixels^2 => pt^2
ax.scatter3D(x,c=c,s=s_pt2)
if __name__ == "__main__":
n_spheres = 50000
x = [random()*100 for i in range(n_spheres)]
y = [random()*100 for i in range(n_spheres)]
z = [random()*100 for i in range(n_spheres)]
s = [random()*1 for i in range(n_spheres)]
c = [[random(),random(),random()] for i in range(n_spheres)]
fig = plt.figure()
ax = plt.subplot(111,projection='3d')
scatter2(fig,s)
请告诉我它的编程方式和语法是否正确,我是初学者。
谢谢!