python - 有效地绘制许多球体

标签 python performance matplotlib 3d

我需要在一张图片中绘制许多大大小小的球体。以下代码可以工作,但运行时间非常长。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect('equal')

u = numpy.linspace(0, 2*numpy.pi, 100)
v = numpy.linspace(0, numpy.pi, 100)
x = numpy.outer(numpy.cos(u), numpy.sin(v))
y = numpy.outer(numpy.sin(u), numpy.sin(v))
z = numpy.outer(numpy.ones(numpy.size(u)), numpy.cos(v))

for k in range(200):
    c = numpy.random.rand(3)
    r = numpy.random.rand(1)
    ax.plot_surface(
        r*x + c[0], r*y + c[1], r*z + c[2],
        color='#1f77b4',
        alpha=0.5,
        linewidth=0
        )

plt.show()

我正在寻找更有效的解决方案。也许 matplotlib 中有一个我没有找到的原生球体艺术家?

最佳答案

不,不存在“球体艺术家”这样的东西。而且就算有,画起来也不会少时间。

您在问题中提出的解决方案是绘制许多球体的明智方法。但是,您可能需要考虑在球体上使用更少的点,

u = numpy.linspace(0, 2*numpy.pi, 12)
v = numpy.linspace(0, numpy.pi, 7)

人们应该始终考虑的一个选项是不要使用 matplotlib 进行 3D 绘图,因为它是 not actually been designed for it ;并使用Mayavi反而。 上面的 Mayavi 看起来像

from mayavi import mlab
import numpy as np

[phi,theta] = np.mgrid[0:2*np.pi:12j,0:np.pi:12j]
x = np.cos(phi)*np.sin(theta)
y = np.sin(phi)*np.sin(theta)
z = np.cos(theta)

def plot_sphere(p):
    r,a,b,c = p
    return mlab.mesh(r*x+a, r*y+b, r*z+c)  


for k in range(200):
    c = np.random.rand(4)
    c[0] /= 10.
    plot_sphere(c)

mlab.show()

虽然计算所需的时间相似,但 Mayavi 中的交互式缩放或平移要快得多。

此外,Mayavi 实际上提供了类似“球体艺术家”的东西,称为 points3d

from mayavi import mlab
import numpy as np

c = np.random.rand(200,3)
r = np.random.rand(200)/10.

mlab.points3d(c[:,0],c[:,1],c[:,2],r)

mlab.show()

enter image description here

关于python - 有效地绘制许多球体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52908498/

相关文章:

python - 想要在同一个 python 脚本中比较 bash 和 python 的时间

javascript - 无法在 Django 上下文中传递 json

c# - Jaccard 得分/距离或重叠百分比

matplotlib - 在 matplotlib 图形上启用白框/禁用透明框

python - Pandas - 以 3 小时的间隔对非正则化数据的一分钟间隔进行重新采样,并用一定时间范围内的数据替换丢失的数据

python - 此子类化 QThread 与 moveToThread 示例需要解释

javascript - v8/chrome/node.js函数内联

javascript - 具有多个同名标记的性能测量

python - 如何使用或操作 hist2d 的输出(返回值)并创建新的直方图

使用 matplotlib 时 Emacs 中的 Python shell 卡住