我目前正在使用python处理应变数据,并使用matplotlib(v.1.5.1)为有限应变椭球创建各种图形输出。
处理1000个椭圆体参数非常快(我重复使用这里提供的一些甜蜜的python代码https://github.com/minillinim/ellipsoid/blob/master/ellipsoid.py),但我的工作流程中的瓶颈与绘制过多3D图片所需的时间有关3d图中的对象。
下面我附上了一小段python代码,用于计算和绘制一堆随机椭圆体。虽然' ellipNumber'很小就像魅力一样。但是,当它达到100时,它需要更长的时间...... 1000秒我打赌你没有耐心等待。
在2D中,我了解使用集合是提高性能的方法:How can I plot many thousands of circles quickly?
假设一个集合确实是要走的路,我环顾四周寻找一个例子并试图填充一个带有椭球坐标的Poly3DCollection,就像他们在这里为3D中的多边形所做的那样:Plotting 3D Polygons in python-matplotlib,但我没有运气设置基于2d x,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个随机椭球的三维图: