Matplotlib 散点图,具有跨子图的标准化颜色图

Matplotlib scatterplot with standardized colormap across subplots

我有两组数据要比较。每组数据都有 x 和 y 值以及每个 x,y 点的一些 z 值。两个数据集之间的z值分布可能相互重叠,但一般会有不重叠的部分。在本例中为 [1,4] 和 [2,6]。我希望配色方案考虑到这一点,这样我就可以在比较两组时看到这些差异。我最终也想使用添加到该图中的颜色条。 一些示例代码:

# Fake Values
vals1 = np.array([[1,1,1],[2,2,4]])
vals2 = np.array([[1,1,2],[2,2,6]])

fig, ax = plt.subplots(1,2, constrained_layout=True)
g1 = ax[0].scatter(x=vals1[:,0], y=vals1[:,1], c=vals1[:,2], cmap='RdBu')
g2 = ax[1].scatter(x=vals2[:,0], y=vals2[:,1], c=vals2[:,2], cmap='RdBu')
fig.colorbar(g2)

这给了我以下信息:

如您所见,子图之间的 z (c?) 值未标准化。 任何帮助将不胜感激。

您可以将两个图的 vmin/vmax 设置为数据的全局 min/max。

分别设置 vmin/vmax 参数:

vmin = np.vstack([vals1,vals2]).min()
vmax = np.vstack([vals1,vals2]).max()

fig, ax = plt.subplots(1,2, constrained_layout=True)
g1 = ax[0].scatter(x=vals1[:,0], y=vals1[:,1], c=vals1[:,2], vmin=vmin, vmax=vmax, cmap='RdBu')
g2 = ax[1].scatter(x=vals2[:,0], y=vals2[:,1], c=vals2[:,2], vmin=vmin, vmax=vmax, cmap='RdBu')
fig.colorbar(g2)

或者创建一个 matplotlib.colors.Normalize() 实例并将其用于 norm 参数:

norm = mcolors.Normalize(
    vmin=np.vstack([vals1,vals2]).min(),
    vmax=np.vstack([vals1,vals2]).max(),
)

fig, ax = plt.subplots(1,2, constrained_layout=True)
g1 = ax[0].scatter(x=vals1[:,0], y=vals1[:,1], c=vals1[:,2], norm=norm, cmap='RdBu')
g2 = ax[1].scatter(x=vals2[:,0], y=vals2[:,1], c=vals2[:,2], norm=norm, cmap='RdBu')
fig.colorbar(g2)