两个散点图子图 seaborn 的相同颜色条

Same colorbar for two scatterplots subfigures seaborn

我有以下代码来生成 seaborn 散点图:

sns.set(
    rc={"figure.figsize": (12.27, 4.27), "figure.dpi": 300, "savefig.dpi": 300},
    font_scale=0.5,
    style="white",
    context="talk",
)

fig, ax = plt.subplots(1, 2)

sns.scatterplot(
    data=df1,
    x="PCA-1 (morgan)",
    y="PCA-2 (morgan)",
    hue="uncertainty",
    palette="Set2_r",
    ax=ax[0],
)
ax[0].set_xlabel("PCA-1 (Morgan)")
ax[0].set_ylabel("PCA-2 (Morgan)")

norm = plt.Normalize(0, df1["uncertainty"].max(),)
sm = plt.cm.ScalarMappable(cmap="Set2_r", norm=norm)
sm.set_array([])
# ax[0].get_legend().remove()


sns.scatterplot(
    data=df2,
    x="PCA-1 (morgan)",
    y="PCA-2 (morgan)",
    hue="uncertainty",
    palette="Set2_r",
    ax=ax[1],
)
ax[1].set_xlabel("PCA-1 (Morgan)")
ax[1].set_ylabel("PCA-2 (Morgan)")
# ax[1].get_legend().remove()


fig.colorbar(sm, ax=ax.flatten(), orientation="vertical")

上面的代码产生了下图:

如您所见,左侧的绘图有一个颜色栏,其范围为 (24, 48),用于我使用的色调 -- uncertainty。我使用 plt.Normalize 函数对 (0, 48) 进行归一化。然而,右边的图有一个范围 (0.6, 1.6),但如果你仔细看,它是用整个颜色图为数据点着色,而不是因为范围而被限制在灰色区域。因为范围 (0.6, 1.6) 应该在那个光谱中,所以我怎样才能用正确的颜色绘制灰色的点?

您应该在散点图中明确指定 vminvmax。对于您的情况,

vmin, vmax = df1.uncertainty.min(), df1.uncertainty.max()

sns.scatterplot(
    data=df1,
    ...
    ax=ax[0],
    vmin = vmin,
    vmax = vmax
)

sns.scatterplot(
    data=df2,
    ...
    ax=ax[1],
    vmin = vmin,
    vmax = vmax
)

Seaborn Scatterplot, any other parameters are passed to Matplotlib scatter 的文档所述,可以指定 vamxvmin 值,确定颜色值的范围。

我通过向上面的每个散点图添加参数 hue_norm=norm 解决了这个问题。产生了以下输出图: