人面不知何处去,桃花依旧笑春风。 ——崔护
文章目录
引言
- 本文主要对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>)
- 查看生成的数据框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对象
- 对
调色板函数sns.cubehelix_palette
的使用可以参考通过函数seaborn.cubehelix_palette生成顺序调色板
对语义映射参数hue
的理解可以参考seaborn可视化统计关系/散点图/折线图
# 生成有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