matplotlib 将基于Nx1阵列的颜色Map图关联到3D体素图

cngwdvgl  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个问题非常类似于this问题。答案对于绘制体素非常有效。然而,我需要找到一种方法来根据一个基于5x1数组的colormap(类型为“jet”)对体素进行着色,该数组被称为“variable”。我还需要将对数colorbar与3D图关联起来。

daupos2t

daupos2t1#

我对问题条件添加了两个更改:
1.体素是定制尺寸(a、B、c)的矩形棱柱,而不是简单的立方体。
1.我定义了一个名为“Ivec”的数组,而不是“variable”,它有更合适的值 用于显示对数色图。
如果想要显示线性色图,他/她可以简单地取消注解注解为“线性比例色图”的行,并注解/删除注解为“对数比例色图”的行

import numpy as np
import matplotlib
import matplotlib.cm as cmx
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd

df = pd.DataFrame({"x": [14630, 14630, 14360, 14360, 14360], "y" : [21750, 21770, 21790, 21930, 21950], "z" : [4690, 4690, 4690, 5290, 5270]})
Ivec = np.array([1, 10, 100, 1000, 10000])

def get_cube():   
    phi = np.arange(1,10,2)*np.pi/4
    Phi, Theta = np.meshgrid(phi, phi) 

    x = np.cos(Phi)*np.sin(Theta)
    y = np.sin(Phi)*np.sin(Theta)
    z = np.cos(Theta)/np.sqrt(2)
    return x,y,z

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
a = 25
b = 8
c = 14

ax.view_init(azim=0, elev=0)
cm = plt.get_cmap('jet')
#cNorm = matplotlib.colors.Normalize(vmin=min(Ivec), vmax=max(Ivec))#linear scale colormap
cNorm = matplotlib.colors.LogNorm(vmin=min(Ivec), vmax=max(Ivec)) #log scale colormap
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm)
scalarMap.set_array(Ivec)
fig.colorbar(scalarMap, ax=ax)
cmapRgba=scalarMap.to_rgba(Ivec) 

for i in df.index:
    x,y,z = get_cube()
    
    # Change the centroid of the cube from zero to values in data frame
    x = x*a + df.x[i]
    y = y*b + df.y[i]
    z = z*c + df.z[i]
    ax.plot_surface(x, y, z, color = cmapRgba[i]) 
    ax.set_zlabel("z")

plt.xlabel("x")
plt.ylabel("y")
plt.show()

相关问题