如何在 Seaborn 中为 KDE 图创建图例?

7

我有一个kdeplot,但是我不知道如何创建图例。

import matplotlib.patches as mpatches  # see the tutorial for how we use mpatches to generate this figure!

# Set 'is_workingday' to a boolean array that is true for all working_days
is_workingday = daily_counts["workingday"] == "yes"
is_not_workingday = daily_counts['workingday'] == "no"
# Bivariate KDEs require two data inputs. 
# In this case, we will need the daily counts for casual and registered riders on workdays
casual_workday = daily_counts.loc[is_workingday, 'casual']
registered_workday = daily_counts.loc[is_workingday, 'registered']

# Use sns.kdeplot on the two variables above to plot the bivariate KDE for weekday rides
sns.kdeplot(casual_workday, registered_workday, color = "red", cmap = "Reds", hue = "workingday", legend = True)

# Repeat the same steps above but for rows corresponding to non-workingdays
casual_non_workday =  daily_counts.loc[is_not_workingday, 'casual']
registered_non_workday = daily_counts.loc[is_not_workingday, 'registered']


# Use sns.kdeplot on the two variables above to plot the bivariate KDE for non-workingday rides
sns.kdeplot(casual_non_workday, registered_non_workday, color = 'blue', cmap = "Blues", legend = True, shade = False)

获取到这个: 在此输入图像描述

我试图获取到这个: 在此输入图像描述

2个回答

16

一种方法是在kdeplot中传递 label=,然后请求显示图例。

geyser = sns.load_dataset("geyser")
long = geyser.loc[geyser['kind']=='long']
short = geyser.loc[geyser['kind']=='short']
sns.kdeplot(x=long["waiting"], y=long["duration"], label='long')
sns.kdeplot(x=short["waiting"], y=short["duration"], label='short')
plt.legend()

输入图片说明

另一种方法是使用seaborn中预置的方法,根据hue=列拆分数据框。 对于您的情况,它看起来像下面这样,但是不知道您的数据框结构,无法确定。有关更多信息,请参见文档

sns.kdeplot(x='casual', y='registered', hue='workingday', data=daily_counts, shade=False, legend=True)

9

当每个kdeplot只使用一种颜色时,另一个答案效果不错。

如果使用像'Reds'这样的colormap,则会显示非常浅的红色。自定义colormap可以显示范围中间的颜色:

from matplotlib import pyplot as plt
import matplotlib.patches as  mpatches
import seaborn as sns
import numpy as np

casual_workday = np.random.randn(100) * 1.2
registered_workday = 0.8 * np.random.randn(100) + casual_workday * 0.2 + 1
sns.kdeplot(x=casual_workday, y=registered_workday, color="red", cmap="Reds", shade=False)

casual_non_workday = np.random.randn(100) * 1.6
registered_non_workday = 0.5 * np.random.randn(100) + casual_non_workday * 0.5 - 1
sns.kdeplot(x=casual_non_workday, y=registered_non_workday, cmap="Blues", shade=False)

handles = [mpatches.Patch(facecolor=plt.cm.Reds(100), label="Workday"),
           mpatches.Patch(facecolor=plt.cm.Blues(100), label="Non-workday")]
plt.legend(handles=handles)
plt.show()

example plot


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