对绘制丘岭密度图ridge plot的详细说明、重叠核密度估计曲线overlapping densities、FacetGrid对象、函数sns.kdeplot、函数FacetGrid.map

人面不知何处去,桃花依旧笑春风。 ——崔护

引言

  • 本文主要对seaborn官网所提供的图例:重叠核密度估计曲线(overlapping densities)进行说明与实现
  • 这张图绘制出来会显得十分高级、不同的变量对应不同的曲线、如同一座又一座小山排列在一起[哭笑]、故又可以将其成为丘岭图(ridge plot)
  • 其中包含seaborn较为深刻的使用逻辑、实现起来好处多多

示例说明

数据生成

  • 常规导入需要用到的库
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style='white', rc={
   'axes.facecolor': (0, 0, 0, 0)})  # 参数axes.facecolor调整画布的颜色

sns.__version__
'0.11.2'
  • 强调seaborn一定要是最新的版本0.11.2、使用Anaconda中的seaborn应该都是要更新的
  • 如果直接在cmd中使用命令行pip install --upgrade seaborn更新完成后、检查seaborn仍为老版本
    可以尝试先进入当前环境:conda activate envname、再进行更新:pip instasll -U seaborn
  • 多少会有一点麻烦、但是问题不会太大
rs = np.random.RandomState(1979)
x = rs.randn(500)                                   # 生成500个随机数、服从均值为0、标准差为1的正态分布
g = np.tile(list('ABCDEFGHIJ'), 50)                 # 循环生成ABCDEFGHIJ这10个字母共50次、g[: 20]
df = pd.DataFrame(dict(x=x, g=g))                   # 将变量x和g拼成数据框
m = df.g.map(ord)                                   # 将数据框中g这一列的字母按照ASCII码对应到十进制、A->65、B->66、C->67、D->68、...
df.x += m                                           # 相当于将原来的随机数进行平移、g为A的x值平移到关于65对称、g为B的x值平移到关于66对称、...
  • 绘制随机生成的变量x的直方图
  • 从图中可以看到、随机变量x关于0对称且满足3 σ \sigma σ原则、显然服从正态分布
plt.hist(x)
(array([ 8., 30., 62., 88., 96., 82., 71., 37., 23.,  3.]),
 array([-2.54389589, -2.00311021, -1.46232454, -0.92153886, -0.38075318,
         0.16003249,  0.70081817,  1.24160384,  1.78238952,  2.3231752 ,
         2.86396087]),
 <a list of 10 Patch objects>)

生成随机变量x的直方图

  • 查看生成的数据框df中的前20条数据
df.iloc[: 20]
x g
0 64.038123 A
1 66.147050 B
2 66.370011 C
3 68.791019 D
4 70.583534 E
5 69.135114 F
6 72.390092 G
7 73.822191 H
8 73.868785 I
9 72.938377 J
10 65.723433 A
11 66.580572 B
12 68.631715 C
13 68.175267 D
14 68.772384 E
15 70.369829 F
16 72.296533 G
17 70.704948 H
18 73.755082 I
19 75.130836 J
  • 对于所生成的字母分布数据、往往是只能画出下面的图像
  • 虽然这样的图像排列整齐、细心调整后也可以更为美观
  • 但绝对算不上新颖、并且各个变量间的比较不会特别地方便、直观
sns.set(font_scale=2)
sns.displot(data=df, x='x', col='g', col_wrap=5, kind='hist', hue='g', kde=True, 
            palette="ch:r=-.2,d=.3_r", legend=False)#, palette="light:m_r")

一般情况下的数据分布展示

开始画图

  • 整个绘制过程可分为6步、总体上还算清晰明了
  • 尽管写了较多的批注、但面面俱到还是十分困难的、所以强调多动手、多思考、自己多试试效果会更好

初始化FacetGrid对象

# 生成有10个颜色块的调色板     
pal = sns.cubehelix_palette(n_colors=10, rot=-.25, light=.7)   
# 向FacetGrid对象中传入数据框df、并根据g这一列来进行分行(row)和语义映射(hue)
g = sns.FacetGrid(df, row='g', hue='g', height
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值