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

问题描述

我有两组数据要比较。每组数据都有 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,2],6]])

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

这给了我以下内容

Scatterplot with bad color scheme

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

解决方法

您可以将两个图的 vmin/vmax 设置为数据的全局最小值/最大值。

单独设置 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[:,y=vals2[:,c=vals2[:,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,norm=norm,cmap='RdBu')
fig.colorbar(g2)

synced vmin/vmax