Matplotlib - 具有不同数字范围但比例相同的相关图

Matplotlib - Correlation plots with different range of numbers but on same scale

我想要一个包含 6 个相关图的 2 x 3 图,共享相同的比例,即使图中的值具有不同的范围。您可以在下面看到我到目前为止的内容。

在第一列中,值的范围是从0到1,对角线上为1,其他地方接近于0。对于其他两列,顶行的值范围为 0 到 1,而底行的值范围为 -1 和 1。第二列和第三列之间的区别在于第二列中的值大约为 0.3(和 -0.3),第三列中的值大约为 0.7(和 -0.7)。

如您所见,有几处似乎不正确。首先,虽然我希望它们都按照相同的色标绘制,深蓝色为-1,黄色为1,但显然不是这样。如果这成立,我们将在第一列中有 bright blue/greenish。我能做些什么来指示颜色的范围?接下来,如何更改右侧色标的标签?我希望它的范围从 -1 到 1。

下面是我的实现。

fig, ax = plt.subplots(nrows=2, ncols=3, figsize=(15,8))
idx_mixed = {False: 0, True: 1}
idx_rho = {0: 0, 0.3: 1, 0.7: 2}
for mixed in [False, True]:
    for rho in [0, 0.3, 0.7]:
        ax[idx_mixed[mixed]][idx_rho[rho]].matshow(results[mixed][rho])

ax[0][0].set_title("No correlation", pad=20, fontsize=14)
ax[0][1].set_title("Weakly correlated", pad=20, fontsize=14)
ax[0][2].set_title("Strongly correlated", pad=20, fontsize=14)
ax[0][0].set_ylabel("Positive correlations", fontsize = 14)
ax[1][0].set_ylabel("Mixed correlations", fontsize = 14)
fig.colorbar(mpl.cm.ScalarMappable(), ax=fig.get_axes())        

您需要向 matshow() 提供一个 norm= 参数,以便将数据缩放到范围 [-1, 1] 而不是由中存在的最小值和最大值定义的范围数据。有关详细信息,请参阅 Colormap Normalization

cmap = 'viridis'
norm = matplotlib.colors.Normalize(vmin=-1, vmax=1)
fig, axs = plt.subplots(2,3)
for ax, d in zip(axs.flat, data):
    m = ax.matshow(d, cmap=cmap, norm=norm)
fig.colorbar(m, ax=axs)