【问题标题】:How to get joint kernel density plots to look better on black background (seaborn)如何让联合核密度图在黑色背景上看起来更好(seaborn)
【发布时间】:2020-11-16 23:51:41
【问题描述】:

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

如何使这更好的想法可能是:

  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)

【问题讨论】:

    标签: python pandas matplotlib plot seaborn


    【解决方案1】:

    在后台,seaborn 正在使用matplotlib 颜色映射。

    This 回答提供了一些关于反转matplotlib 颜色图的见解,适用于此处:

    所有标准颜色图也都有反转版本。它们具有相同的名称,并在末尾添加了_r。 (Documentation here)。

    您的某些颜色图不适用于最新版本,因此我使用了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 的颜色图。

    【讨论】:

    • 嗨,马修!是的,这就是我要找的。你能告诉我你安装了什么版本的matplotlib吗?我收到错误:'Reds_r' is not a valid value for name; supported values are '538', 'accent', 'acton', 'algae', 'amp', 'balance', 'bamako'... 并将继续迭代以解决此问题。不过你的身材看起来不错,这就是我想要的。
    • @JAG2024 Matplotlib 版本为3.1.3,Python 版本为3.7.6
    • 我注意到您在原始代码中使用了reds(全部小写)。你可以试试reds_r
    • 不错的答案+10。为颜色条刻度标签添加足够的间距以不重叠也可能是有益的。
    • 一旦我使用pip install matplotlib==3.1.3 切换到您的matplotlib 版本,然后它就可以使用颜色图:reds_rblues_r 等!非常感谢。是的,同意@TrentonMcKinney 的足够间距,它可以正常工作:plt.figure(figsize=(10, 6), dpi=80, facecolor='w', edgecolor='k')
    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 2018-01-05
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多