如何使用matplotlib(Axes3D)高效地绘制大量的3D椭球?

11 浏览
0 Comments

如何使用matplotlib(Axes3D)高效地绘制大量的3D椭球?

我目前正在使用Python处理应变数据,并使用matplotlib(版本1.5.1)为有限应变椭球创建各种图形输出。\n处理数千个椭球参数非常快速(我正在重用这里提供的一些优秀的Python代码:https://github.com/minillinim/ellipsoid/blob/master/ellipsoid.py),但是我的工作流程中的瓶颈与在3D图中绘制大量3D对象所需的时间有关。\n下面我附上了一小段Python代码片段,用于计算和绘制一堆随机椭球。当\'ellipNumber\'较小时,它的表现非常出色。但是,当达到100时,它需要更长时间... 我敢打赌,当达到数千个时,你可能没有耐心等待。\n在2D中,我了解到使用集合是提高性能的方法:如何快速绘制成千上万个圆?\n假设集合确实是正确的方法,我寻找了一个示例,并尝试像这里为3D多边形设置顶点那样,使用椭球坐标填充Poly3DCollection:在python-matplotlib中绘制3D多边形,但我没有成功设置基于2D x、y和z数组的顶点。\n对于如何改进椭球绘制性能的任何建议/评论,将不胜感激!\n祝好!\n

import numpy as np
from numpy import linalg
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib.colors as colors
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, projection='3d')
# 椭球数量
ellipNumber = 10
# 设置颜色映射以使每个椭球具有唯一的颜色
norm = colors.Normalize(vmin=0, vmax=ellipNumber)
cmap = cm.jet
m = cm.ScalarMappable(norm=norm, cmap=cmap)
# 迭代计算和绘制每个椭球
for indx in xrange(ellipNumber):
    # 椭球和中心点的矩阵形式
    A = np.array([[np.random.random_sample(),0,0],
                  [0,np.random.random_sample(),0],
                  [0,0,np.random.random_sample()]])
    center = [indx*np.random.random_sample(),indx*np.random.random_sample(),indx*np.random.random_sample()]
    # 计算旋转矩阵和轴的半径
    U, s, rotation = linalg.svd(A)
    radii = 1.0/np.sqrt(s) * 0.3 #将半径缩小0.3倍
    # 计算椭球表面的笛卡尔坐标
    u = np.linspace(0.0, 2.0 * np.pi, 60)
    v = np.linspace(0.0, np.pi, 60)
    x = radii[0] * np.outer(np.cos(u), np.sin(v))
    y = radii[1] * np.outer(np.sin(u), np.sin(v))
    z = radii[2] * np.outer(np.ones_like(u), np.cos(v))
    for i in range(len(x)):
        for j in range(len(x)):
            [x[i,j],y[i,j],z[i,j]] = np.dot([x[i,j],y[i,j],z[i,j]], rotation) + center
    ax.plot_surface(x, y, z,  rstride=3, cstride=3,  color=m.to_rgba(indx), linewidth=0.1, alpha=1, shade=True)
plt.show()

\n带有10个随机椭球的3D图:\n\"带有10个随机椭球的3D图\"

0