如何在黑色背景下优化联合核密度图的显示(Seaborn)

3
我有三个数据集(df1,df2,df3,这里是随机生成的示例),我想在黑色背景上一起绘制联合核密度图。我不喜欢联合kde的重叠部分,因为当白色部分(最低密度)与黑色背景重叠时,它真的很突出。相比之下,这在白色背景下看起来很好(将在底部包括以进行比较),但我需要它成为黑色背景。

改进方法的一个想法可能是:

  1. 颠倒颜色条,使最低密度为暗色,最高密度为亮色。

有人知道如何做到这一点或如何使其更好吗?

我不知道从哪里开始查找,但我在seaborn的GitHub上发现了这个closed issue,其中有关于阴影的讨论。

import numpy as np
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt


# Uncomment for black background figure
plt.rcParams.update({
    "grid.color": "white",
    'hatch.color': 'k',
    "lines.color": "white",
    "patch.edgecolor": "white",
    'patch.facecolor': ([0, 1, 1]),
    'grid.alpha': 0.4,
    "text.color": "lightgray",
    "axes.facecolor": "black",
    "axes.edgecolor": "lightgray",
    "axes.labelcolor": "white",
    "xtick.color": "white",
    "ytick.color": "white",
    "grid.color": "lightgray",
    "figure.facecolor": "black",
    "figure.edgecolor": "black",
    "savefig.facecolor": "black",
    "savefig.edgecolor": "black"})

df1 = pd.DataFrame(np.random.randint(0,60,size=(1500, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.randint(20,80,size=(1500, 4)), columns=list('ABCD'))
df3 = pd.DataFrame(np.random.randint(40,100,size=(1500, 4)), columns=list('ABCD'))

f, axs = plt.subplots()

# Draw density plots
axs = sns.kdeplot(df1.A, df1.B, alpha=0.5,
                 cmap="Reds", shade=True, shade_lowest=False, cbar=True)
axs = sns.kdeplot(df2.A, df2.B, alpha=0.5,
                 cmap="Oranges", shade=True, shade_lowest=False, cbar=True)
axs = sns.kdeplot(df3.A, df3.B, alpha=0.5,
                 cmap="Blues", shade=True, shade_lowest=False, cbar=True)

enter image description here

enter image description here

1个回答

2
在底层,seaborn使用了matplotlib的调色板。
这个答案提供了有关反转matplotlib调色板的信息,并且适用于此处:
标准调色板都有它们的反转版本。它们的名称相同,末尾加上_r。(文档在此)。
您的一些调色板在最新版本中无法正常工作,因此我改用了RedsOrangesBlues。请注意,我将它们换成了Reds_rOranges_rBlues_r。我相信这是您要寻找的结果。
# Draw density plots
axs = sns.kdeplot(
    df1.A, df1.B, alpha=0.5, cmap="Reds_r", shade=True, shade_lowest=False, cbar=True,
)
axs = sns.kdeplot(
    df2.A, df2.B, alpha=0.5, cmap="Greens_r", shade=True, shade_lowest=False, cbar=True
)
axs = sns.kdeplot(
    df3.A, df3.B, alpha=0.5, cmap="Blues_r", shade=True, shade_lowest=False, cbar=True
)

在这里输入图片描述

更新:

您可以手动选择一个颜色映射并对其进行反转,方法是获取该颜色映射并调用reverse函数:

color_map = plt.cm.get_cmap('Blues')
reversed_color_map = color_map.reversed()

然后将你反转的颜色映射给kdeplot:
axs = sns.kdeplot(
    df3.A, df3.B, alpha=0.5, cmap=reversed_color_map , shade=True, shade_lowest=False, cbar=True
)

这样您就可以使用任何颜色映射,甚至是没有预定义_r的映射。


1
嗨,马修!是的,这就是我要找的东西。你能告诉我你安装了哪个版本的matplotlib吗?我遇到了错误:“Reds_r”不是名称的有效值;支持的值包括“538”、“accent”、“acton”、“algae”、“amp”、“balance”、“bamako”… 我将继续迭代以找出原因。不过你的图看起来很好,正是我想要的。 - JAG2024
@JAG2024 Matplotlib 版本为 3.1.3,Python 版本为 3.7.6 - Salvatore
我注意到你原来的代码中使用了 reds(全小写)。你可以尝试使用 reds_r - Salvatore
我使用手动方法更新了反转颜色映射。 - Salvatore
1
很好的回答 +10。为了避免颜色条刻度标签重叠,添加足够的间距可能也会有益处。 - Trenton McKinney
1
一旦我使用pip install matplotlib==3.1.3切换到您的matplotlib版本,就可以使用颜色映射:reds_rblues_r等!非常感谢。是的,我同意@TrentonMcKinney的充足间距,它与plt.figure(figsize=(10, 6), dpi=80, facecolor='w', edgecolor='k')很好地配合使用。 - JAG2024

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接