matplotlib 在Python中将第4个变量显示为3D图上的色彩Map表

kxkpmulp  于 2022-11-15  发布在  Python
关注(0)|答案(1)|浏览(194)

任务

我正在尝试生成一个图,将我的数据表示在4维。我的选择是一个三维图,其中第四维是表示与色彩Map表。我的数据有一些NaN值。
我的尝试
使用任意一组数据,我的4个变量是XYZC。其中,我希望XYZ位于3D图的各自轴上,C定义色彩Map表。ZC都有一些匹配的NaN值。

import numpy as np
import matplotlib.pyplot as plt

# generate some data
X, Y = np.meshgrid(np.linspace(1, 10, 20), np.linspace(1, 10, 20))  # 20 by 20 grid
Z = np.linspace(0, 10, 400).reshape((20, 20))  # data to plot on the vertical axis
Z.ravel()[np.random.choice(Z.size, 10, replace=False)] = np.nan  # some values are nan
C = np.cos(X) - np.sin(Y)  # 4th variable, to be represented in 4th dimension using colormap
C[np.isnan(Z)] = np.nan  # corresponding values are nan

我尝试先生成XYC的3D色彩Map表,并将其存储在变量fc中。此代码返回第一个色彩Map表(不幸的是,StackOverflow不允许我发布绘图图像)。

fig = plt.figure()
ax = fig.add_subplot(221, projection='3d')
# plot the surface for 4th dimension to get its colormap (facecolors)
surf = ax.plot_surface(X, Y, C, cmap='turbo')
fc = surf.get_facecolors()

然后,我生成了XYZ的所需3D色彩图,将colormap参数设置为fc(同时对fc进行了一些整形,因为**get_facecolors()**返回RGBA数组的平面元组),这将返回第二个色彩图。

# get_facecolors() returns a tuple of 1D arrays, but the plot_surface() facecolors argument requires a 3D array
fc = np.array(fc)
fc = fc.reshape((19, 19, 4))
ax = fig.add_subplot(222, projection='3d')
ax.plot_surface(X, Y, Z, facecolors=fc, cmap='turbo')

plt.show()

问题是

因此,从两个图中可以看出,第一个图中的色彩Map表在应用到第二个图之前会发生混合。fc = fc.reshape((19, 19, 4))中的整形是必要的,因为这些是面色所需的尺寸,但我猜正是这种整形导致了颜色的混合。
我已经尝试了其他解决方案提出的This question从几年前,但没有运气。
任何关于如何让一个图的色彩图转换到另一个图的建议都将非常感谢!以及任何在图上表示4个变量的更容易/更好选择的建议。
提前感谢!

wh6knrhe

wh6knrhe1#

需要使用Normalize和颜色贴图来计算面颜色,如下所示:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import Normalize

# generate some data
X, Y = np.meshgrid(np.linspace(1, 10, 20), np.linspace(1, 10, 20))  # 20 by 20 grid
Z = np.linspace(0, 10, 400).reshape((20, 20))  # data to plot on the vertical axis
Z.ravel()[np.random.choice(Z.size, 10, replace=False)] = np.nan  # some values are nan
C = np.cos(X) - np.sin(Y)  # 4th variable, to be represented in 4th dimension using colormap
C[np.isnan(Z)] = np.nan  # corresponding values are nan

cmap = cm.turbo
norm = Normalize(vmin=np.nanmin(C), vmax=np.nanmax(C))
fc = cmap(norm(C))

fig = plt.figure()
ax = fig.add_subplot(221, projection='3d')
# plot the surface for 4th dimension to get its colormap (facecolors)
surf = ax.plot_surface(X, Y, C, facecolors=fc)

ax = fig.add_subplot(222, projection='3d')
ax.plot_surface(X, Y, Z, facecolors=fc)

相关问题