使用seaborn绘制数据图

seaborn(以下简称 sns) 是以 matplotlib 为基础的绘图包,有非常丰富的绘图类型,而且形式精美,确实简化了画图的流程,非常适合统计领域的绘图。

目前尝试过的绘图方法有:scatter 散点图、regplot 拟合图、boxplot 箱线图、jointplot 联合分布图、distplot 分布图、heatmap热力图等。它们的画图风格普遍比直接用 matplotlib.pyplot 画图要好一点点,使用也非常方便,只是需要对其中的参数做一点点认识。

数据分布图

散点图 scatter

sns.scatterplot(x, y, data, ax, size)

其加载数据的方式比较独特,例如 data 项是一个 dataframe,参数 xy 分别是数据的名称,那么 dataframe 中列名为 x 和 y 的列就分别是点的坐标数据了。

【其实也非常巧妙,只不过要是名称写的不对,那数据就加载不出来了】

ax 是画图的位置。方便了面向对象的画图,如果不指定,会单独画一张图的。

size 指定点的大小,似乎可以简化为 s。这里的点是可以很细小的。

分布图 distplot

sns.distplot(x, hist, kde, rug) 可以画分布图

  1. 参数 hist 表示是否画出直方图
  2. 参数 kde 表示是否画出高斯核密度估计图(大致感觉就是比直方图更平滑的分布图,对比较离散的数据更友好)
  3. 参数 rug 表示是否画出 rugplot,也叫地毯图,用短的竖线表示这里有数据

举例:

1
ax = sns.distplot(x, rug=True, hist=False)

distplot_exp

单独使用

  1. 可以单独使用 kdeplot 对数据作核密度统计
  2. 可以单独使用 rugplot 添加数据的地毯图 rugplot

箱线图 boxplot

箱线图是一种看上去奇奇怪怪,但是确实很反映数据分布的一种图,前提是数据密度足够:一个 x 最好对应多个 y。

1
ax = sns.boxplot(x, y, data)

../_images/seaborn-boxplot-2.png

另外,了解箱线图的意义可能也很重要:

箱线图是基于五个数字汇总(“最小值”、第一四分位数 (Q1)、中位数、第三四分位数 (Q3) 和“最大值”)显示数据分布的标准化方式。

它可以表现出异常值及其值,还可以表明数据是否对称、数据分组的紧密程度以及数据是否以及如何倾斜。

参考:了解箱线图

联合分布 jointplot

有时,可能需要同时对 x 和 y 的分布规律做出统计,形成带有双侧分布图的散点图,那么就可以使用 联合分布 jointplot 绘图,例如:

1
sns.jointplot(x, y, kind='reg', data);

jointplot_exp

参考:

  1. Seaborn中文教程(三):数据集的分布
  2. sns scatterplot
  3. sns distplot

数据拟合图

regplot

sns.regplot(x, y, data, ax)

可以用来对数据进行拟合,上面的参数是必备的,给出数据的绘图位置。

如果想要对数据进行各种拟合,下面的设置才是关键:

order:定义拟合的最大阶次;

ci:回归估计的置信区间大小,数字在 0-100 之间(百分比)

logistic:使用逻辑回归拟合;

lowess:使用 statsmodels 估计非参数 Lowess模型,一种局部加权线性回归方法(没有置信区间)

rubust:使用statsmodels 估计稳健回归;

logx:进行 y ~ log(x) 形式的线性回归

例如:

1
2
3
4
5
6
7
8
9
10
sns.regplot(x=cols_name[0],
y=cols_name[1],
data=dataframe,
ax=ax,
# order=order, ci=90,
lowess=True,
color='r',
scatter_kws={'s':5, 'color':'gray'},
line_kws={'lw':1}
)

这里就实现了局部加权线性拟合的方法,没有设置阶数和置信区间;

同时设置了线条类型、点的颜色等参数。

lmplot

lmplot 和 regplot 的区别在于传入的数据类型:

  1. regplot 可以接受numpy数组、pandas序列等类型的 x、y 变量,或者直接对 data 传入 dataframe 对象。
  2. lmplot 必须有 data 数据,x 和 y 也必须是 字符串!

除此之外,几乎是一样的

参考:

  1. sns.regplot
  2. Regression Plots in Python with Seaborn
  3. seaborn: 回归模型的可视化

相关性分析

变量关系组图 pairplot

如果有一组整理好的 dataframe 数据,可以直接使用 sns.pairplot(data) 进行绘制,结果如下:

../_images/pairplot_1_0.png

对于数据种类较少的情况,该图能够很好地囊括数据两两之间的分布关系,对于总体性的把握很有帮助。但是数据种类比较多的时候,这张图将会很拥挤,效果就不够好了。

可以通过添加和修改参数,非常灵活地定义图片内容:

  • hue 参数,可以分组
  • kind
    • ='kde' 可以使用 高斯核密度估计画图,不仅对直方图进行 kde 估计,也会对两两数据之间的分布图进行 kde 估计(分布曲线+等高线图)
    • ='hist' 可以画直方图 + 马赛克图

热力图 heatmap

经常用于绘制相关系数的图片。

一般思路:

  • 使用 pandas 包中的 dataframe.corr(method='pearson') 计算数据的相关系数矩阵
  • 然后使用 sns.heatmap(corr_matrix) 就可以得到热力图了

还有一些参数:

  • cmap 可以设置色阶,默认是一种黑橘红的配色,如果用 YlGnBu 会呈现出 青蓝的配色,很好看
  • annot 布尔值,表示是不是要在格子中显示出数字
  • cbar 颜色条

img

参考:python3.x-seaborn.heatmap随笔

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2022 Sun Yue

请我喝杯咖啡吧~

支付宝
微信