我有一个问题非常类似于this问题。答案对于绘制体素非常有效。然而,我需要找到一种方法来根据一个基于5x1数组的colormap(类型为“jet”)对体素进行着色,该数组被称为“variable”。我还需要将对数colorbar与3D图关联起来。
colorbar
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()
1条答案
按热度按时间daupos2t1#
我对问题条件添加了两个更改:
1.体素是定制尺寸(a、B、c)的矩形棱柱,而不是简单的立方体。
1.我定义了一个名为“Ivec”的数组,而不是“variable”,它有更合适的值 用于显示对数色图。
如果想要显示线性色图,他/她可以简单地取消注解注解为“线性比例色图”的行,并注解/删除注解为“对数比例色图”的行