如何利用matplotlib(Axes3D)高效地绘制大量的三维椭球体?

2024-06-28 19:03:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在用python处理应变数据,并使用matplotlib(v.1.5.1)为有限应变椭球体创建各种图形输出。在

处理1000个椭球体参数是相当快的(我重用了一些可爱的python代码,这里是https://github.com/minillinim/ellipsoid/blob/master/ellipsoid.py),但是我的工作流程中的瓶颈与在3D绘图中绘制过多的3D对象所需的时间有关。在

下面我附加了一个小的python代码片段,它计算并绘制了一组随机椭球体。虽然“ellipNumber”很小,但却很有魅力。但是,当它达到100的时候需要更长的时间。。我敢打赌你不会有耐心等了。在

在2D中,我理解使用集合是提高性能的方法:How can I plot many thousands of circles quickly?

假设一个集合确实是可行的方法,我四处寻找一个例子,并尝试用椭球坐标填充Poly3DCollection,就像他们在3D中对多边形所做的那样:Plotting 3D Polygons in python-matplotlib,但是我没有幸根据2dx、y和z数组设置顶点。在

如有任何关于如何提高椭球体绘图性能的建议/意见,我们将不胜感激!在

干杯

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')

# number of ellipsoids 
ellipNumber = 10

#set colour map so each ellipsoid as a unique colour
norm = colors.Normalize(vmin=0, vmax=ellipNumber)
cmap = cm.jet
m = cm.ScalarMappable(norm=norm, cmap=cmap)

#compute each and plot each ellipsoid iteratively
for indx in xrange(ellipNumber):
    # your ellispsoid and center in matrix form
    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()]

    # find the rotation matrix and radii of the axes
    U, s, rotation = linalg.svd(A)
    radii = 1.0/np.sqrt(s) * 0.3 #reduce radii by factor 0.3 

    # calculate cartesian coordinates for the ellipsoid surface
    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()

带有10个随机椭球体的3D绘图:

3D plot with 10 random ellipsoids


Tags: sampleinimport绘图forplotmatplotlibas