Python:在 Matplotlib 中绘制均匀分布的球体

标签 python matplotlib plot 3d mayavi

我正在尝试创建一个有点像这样的情节:

enter image description here

在所有最小值之上有球体。

表面可以用 sin(x)*sin(y) 图来近似:

import numpy as np
import matplotlib.pyplot as plt

def func(x, y):
  return np.sin(2*np.pi*x)*np.sin(2*np.pi*y) / 3

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = y = np.arange(-1.0, 1.0, 0.05)
X, Y = np.meshgrid(x, y)
zs = np.array([func(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))])
Z = zs.reshape(X.shape)

ax.plot_surface(X, Y, Z, color="grey")
ax.set_zlim3d(-1,1)

plt.show()

但是我不确定如何将均匀分布的球体添加到其中。有人能帮忙吗?

最佳答案

使用matplotlib难免会遇到对象被隐藏在其他对象后面的问题。 matplotlib 3d FAQ 中也说明了这一点建议使用 mayavi .

在 mayavi 中,解决方案如下所示:

from mayavi import mlab
import numpy as np

### SURFACE '''
x,y = np.meshgrid(np.linspace(-2.5,2), np.linspace(-2,2))
f = lambda x,y: .4*np.sin(2*np.pi*x)*np.sin(2*np.pi*y)
z=f(x,y)
mlab.surf(x.T,y.T,z.T, colormap="copper")

### SPHERES '''
px,py = np.meshgrid(np.arange(-2,2)+.25, np.arange(-2,2)+.75)
px,py = px.flatten(),py.flatten()
pz = np.ones_like(px)*0.05
r = np.ones_like(px)*.4
mlab.points3d(px,py,pz,r, color=(0.9,0.05,.3), scale_factor=1)


mlab.show()

enter image description here

关于Python:在 Matplotlib 中绘制均匀分布的球体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45723119/

相关文章:

python - 在电子邮件中包含 cron 作业脚本输出

r - 基础 R 中缺失值的面积图

python - 在具有双 y 轴的 Matplotlib 图中在条形前面排列线条

python - 一系列列数据的散点图

Python Flask Rest Plus - 返回响应对象以及描述

python - django 用一个提交按钮提交两种不同的表单

python - 属性错误: 'DataFrame' object has no attribute 'ravel'

python - 如何估计噪声层后面的高斯分布?

python - matplotlib 不会绘制 python3

Python:保留来自 matplotlib 热图及其图例的 Numpy NaN 值