两个散点图子图 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) 应该在那个光谱中,所以我怎样才能用正确的颜色绘制灰色的点?
您应该在散点图中明确指定 vmin
和 vmax
。对于您的情况,
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 的文档所述,可以指定 vamx
和 vmin
值,确定颜色值的范围。
我通过向上面的每个散点图添加参数 hue_norm=norm
解决了这个问题。产生了以下输出图:
我有以下代码来生成 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) 应该在那个光谱中,所以我怎样才能用正确的颜色绘制灰色的点?
您应该在散点图中明确指定 vmin
和 vmax
。对于您的情况,
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 的文档所述,可以指定 vamx
和 vmin
值,确定颜色值的范围。
我通过向上面的每个散点图添加参数 hue_norm=norm
解决了这个问题。产生了以下输出图: