Python 球面上的密度图
如果球坐标中给定的(θ,φ)点对应一组值,如何在球面上绘制密度图?我发现了如何构造一个球体,例如or。第一个示例非常好看-需要轴和热图。如果您对Python 球面上的密度图,python,matplotlib,matplotlib-basemap,Python,Matplotlib,Matplotlib Basemap,如果球坐标中给定的(θ,φ)点对应一组值,如何在球面上绘制密度图?我发现了如何构造一个球体,例如or。第一个示例非常好看-需要轴和热图。如果您对QuTip的Bloch类进行子类化,并改变它绘制球体的方式,则可以绘制密度图并保留它创建的所有其他框架 使用,并更改Blochclass的绘图函数。将它放在您自己的子类中可以防止您对库进行黑客攻击 from qutip import Bloch from math import sqrt, sin, cos, pi from colorsys impor
QuTip
的Bloch
类进行子类化,并改变它绘制球体的方式,则可以绘制密度图并保留它创建的所有其他框架
使用,并更改Bloch
class的绘图函数。将它放在您自己的子类中可以防止您对库进行黑客攻击
from qutip import Bloch
from math import sqrt, sin, cos, pi
from colorsys import hsv_to_rgb
from numpy import linspace, outer, ones, sin, cos, arccos, arctan2, size, empty
class BlochDensity(Bloch):
def plot_back(self):
# back half of sphere
u = linspace(0, pi, 25)
v = linspace(0, pi, 25)
x = outer(cos(u), sin(v))
y = outer(sin(u), sin(v))
z = outer(ones(size(u)), cos(v))
colours = empty(x.shape, dtype=object)
for i in range(len(x)):
for j in range(len(y)):
theta = arctan2(y[i,j], x[i,j])
phi = arccos(z[i,j])
colours[i,j] = self.density(theta, phi)
self.axes.plot_surface(x, y, z, rstride=1, cstride=1,
facecolors=colours,
alpha=self.sphere_alpha,
linewidth=0, antialiased=True)
# wireframe
self.axes.plot_wireframe(x, y, z, rstride=5, cstride=5,
color=self.frame_color,
alpha=self.frame_alpha)
# equator
self.axes.plot(1.0 * cos(u), 1.0 * sin(u), zs=0, zdir='z',
lw=self.frame_width, color=self.frame_color)
self.axes.plot(1.0 * cos(u), 1.0 * sin(u), zs=0, zdir='x',
lw=self.frame_width, color=self.frame_color)
def plot_front(self):
# front half of sphere
u = linspace(-pi, 0, 25)
v = linspace(0, pi, 25)
x = outer(cos(u), sin(v))
y = outer(sin(u), sin(v))
z = outer(ones(size(u)), cos(v))
colours = empty(x.shape, dtype=object)
for i in range(len(x)):
for j in range(len(y)):
theta = arctan2(y[i,j], x[i,j])
phi = arccos(z[i,j])
colours[i,j] = self.density(theta, phi)
self.axes.plot_surface(x, y, z, rstride=1, cstride=1,
facecolors=colours,
alpha=self.sphere_alpha,
linewidth=0, antialiased=True)
# wireframe
self.axes.plot_wireframe(x, y, z, rstride=5, cstride=5,
color=self.frame_color,
alpha=self.frame_alpha)
# equator
self.axes.plot(1.0 * cos(u), 1.0 * sin(u),
zs=0, zdir='z', lw=self.frame_width,
color=self.frame_color)
self.axes.plot(1.0 * cos(u), 1.0 * sin(u),
zs=0, zdir='x', lw=self.frame_width,
color=self.frame_color)
我在这里做的是让绘图部分调用BlochDensity
:self.density(θ,phi)
——我还没有定义它
创建BlochDensity
对象后,需要创建该函数,它是theta,phi
到密度的映射。我建议使用创建函数,如下所示:
from scipy.interpolate import interp2d
from numpy.random import rand
b = BlochDensity()
b.sphere_alpha=0.5
thetas, phis = linspace(-pi,pi,10), linspace(0,pi,10)
density = rand(len(thetas), len(phis))
#scale density to a maximum of 1
density /= density.max()
interpolated_density = interp2d(thetas, phis, density)
def f(theta, phi):
return hsv_to_rgb(interpolated_density(theta,phi), 1, 1)
b.density = f
b.show()
b.density = f
b.show()
如果您想提高分辨率,只需更改
BlochDensity
的plot.*
函数中的linspace中的数字,我们需要更多信息。你们希望它只是一个用密度的强度着色的球形图吗?或者你想让它在对应于密度的点上改变R?(我推荐前者)。如果你想让情节具有交互性,我在MayaVi上的效果要好得多。如果您只想从特定的视角进行静态打印,那么matplotlib应该可以。另外,您尝试过什么?你有一个包含数据的文件吗?我试着放一个Mathematica图形,但我没有足够的信誉点来做这件事——它只是一个有热图的球体。我在考虑使用与数据点对应的值对球体进行自定义着色。你知道如何在中创建这个漂亮的球体吗?包括链接,有人会在图像中为你编辑。你可以通过更改Bloch
类来实现这一点-它使用plot\u surface
,这意味着你可以通过“facr_给“kwarg”上色,然后自己设置颜色或脸。你想得到一个像这样的图吗?刚刚意识到,如果邻域中的值更小,那么底部的演示图像在密度图方面看起来会更好,因此有更少的波瓣。试着缩小它,看看它是什么样子。