【问题标题】:density plot on a sphere Python球体Python上的密度图
【发布时间】:2015-02-04 11:28:28
【问题描述】:

如果我有对应于球坐标中给定 (theta,phi) 点的值数组,如何在球体表面绘制密度图?我发现了如何构建一个球体,例如Bloch sphereplotting on a sphere。第一个示例非常好看 - 需要轴和热图。

【问题讨论】:

  • 我们需要更多信息。您是否希望它只是一个以密度强度着色的球形图?或者你想让它在与密度相对应的点上改变 R? (我推荐前者)。如果您希望情节具有交互性,我使用 MayaVi 获得了更好的结果。如果您只想要特定视角的静止图,那么 matplotlib 应该没问题。
  • 另外,你试过什么?你有我们可以玩的数据文件吗?
  • 我尝试放置 Mathematica 图形,但我没有足够的声望点来执行此操作 - 它只是一个带有热图的球体。我正在考虑使用与数据点对应的值对球体进行自定义着色。你知道如何在Bloch sphere 中创建这个漂亮的球体吗?
  • 包含链接,有人会为您编辑图片。
  • 您可以通过更改 Bloch 类来做到这一点 - 它使用 plot_surface ,这意味着您可以将“facr_colors` kwarg 传递给它,并自己设置颜色或面孔。你想得到像this 这样的情节吗?

标签: python matplotlib matplotlib-basemap


【解决方案1】:

如果您将QuTipBloch 类子类化,并更改它绘制球体的方式,您可以绘制密度图并保留它创建的所有其他框架。

采用matplotlib surface_plot examples 并更改Bloch 类的绘图功能有效。将它放在您自己的子类中可以防止您对库进行黑客攻击。

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(theta, phi) 的函数 - 我还没有定义。

创建BlochDensity 对象后,您需要创建该函数,即theta, phi 到您的密度的映射。我建议使用SciPy's 2D interpolation 创建函数,如下所示:

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

如果要提高分辨率,只需更改BlochDensityplot_* 函数内的linspace 中的数字即可。

【讨论】:

  • 刚刚意识到,如果 linspace 中的值更小,则底部的演示图像在密度图方面看起来会更好,因此波瓣更少。尝试缩小它以查看它的样子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多