首页 > 解决方案 > 如何使用 Matplotlib 创建基于 RGBA 数据的彩色 3D 体积图?

问题描述

我想在 Matplotlib(或任何合适的替代方案)中创建一个基于 RGBA 颜色的 3D 图,类似于这个():

3D

基本思想是:

  1. 拥有一个数据集,其中包含 R、G 和 B 通道的相关 alpha 值。也就是说,当 R=0 时,红色通道是透明的,当 R=1 时,红色通道是完全不透明的。
  2. 叠加生成的 RGB 通道以获得图像 - 就像投影仪制作的真实图像一样,但是是 3D 的。在 2D 中我可以用 解决它pyplot.imshow,但我怎样才能在 3D 中做一些等效的事情呢?

例如,这里有一些类似于我的任意数据:

x = y = z = np.linspace(-3, 3, 200)
xx, yy, zz = np.meshgrid(x, y, z, indexing='ij')
gauss = np.exp(-(xx**2+yy**2+zz**2)/2)
red = np.sin((xx+yy) * np.pi)**2 * gauss
green = np.cos((yy+zz) * np.pi)**2 * gauss
blue = np.sin((xx+zz+0.25) * np.pi)**2 * gauss

如果这是 2D 的,我会沿着这条线做一些事情,但理想情况下颜色会混合并且不会相互重叠。(我不确定如何在没有 PIL 的情况下在 2D 中做到这一点,但这对于这个问题的核心并不重要。)

# Create R, G and B channels and add the data as alpha value
red2, green2, blue2 = red[100], green[100], blue[100]
R = np.broadcast_to([1.0, 0, 0], (*red2.shape, 3))
G = np.broadcast_to([0, 1.0, 0], (*green2.shape, 3))
B = np.broadcast_to([0, 0, 1.0], (*blue2.shape, 3))
r = np.insert(R, 3, red2, axis=-1)
g = np.insert(G, 3, green2, axis=-1)
b = np.insert(B, 3, blue2, axis=-1)

# plot everything:
plt.imshow(r, aspect='auto', origin='lower', extent=(-3,3,-3,3))
plt.imshow(g, aspect='auto', origin='lower', extent=(-3,3,-3,3))
plt.imshow(b, aspect='auto', origin='lower', extent=(-3,3,-3,3))
plt.gca().set_facecolor('black')
plt.show()

2d 迷幻的例子

但是我怎么能在 3D 中做类似的事情呢?

标签: pythonmatplotlibplot3drgba

解决方案


推荐阅读