博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
seaborn常用速查手册
阅读量:4295 次
发布时间:2019-05-27

本文共 15675 字,大约阅读时间需要 52 分钟。

Seaborn 可视化

1.简介

Seaborn是一个在Python中制作有吸引力和信息丰富的统计图形的库。它建立在之上,并与堆栈紧密集成,包括支持来自和和数据结构和统计例程。 Seaborn旨在将可视化作为探索和理解数据的核心部分。绘图函数对包含整个数据集的数据框和数组进行操作,并在内部执行必要的聚合和统计模型拟合以生成信息图。如果matplotlib“试图让事情变得简单容易和难以实现”,seaborn图使一套明确的方案让事情变得容易。 Seaborn可以认为是对matplotlib的补充,而不是它的替代品。在数据可视化方面能够很好的表现。

2. seaborn入门

2.1 单变量分布

%matplotlib inlineimport numpy as npimport pandas as pdfrom scipy import stats, integrateimport matplotlib.pyplot as pltimport seaborn as snssns.set(color_codes=True)np.random.seed(sum(map(ord, "distributions"))) 
1
2
3
4
5
6
7
8

2.1.1 灰度图

最方便快捷的方式~

# kde表示生成核密度估计x = np.random.normal(size=100)sns.distplot(x, kde=True) 
1
2
3

png

更精细的刻画,调节bins,对数据更具体的做分桶操作。

sns.distplot(x, kde=True, bins=20) 
1

png

使用rug生成实例:

sns.distplot(x, kde=False, bins=20, rug=True) 
1

png

生成实例的好处:指导你设置合适的bins。

2.1.2 核密度估计

通过观测估计概率密度函数的形状。

有什么用呢?待定系数法求概率密度函数~

核密度估计的步骤:

* 每一个观测附近用一个正态分布曲线近似
* 叠加所有观测的正太分布曲线
* 归一化

在seaborn中怎么画呢?

sns.kdeplot(x) 
1

png

bandwidth的概念:用于近似的正态分布曲线的宽度。

sns.kdeplot(x)sns.kdeplot(x, bw=.2, label="bw: 0.2")sns.kdeplot(x, bw=2, label="bw: 2")plt.legend() 
1
2
3
4

png

2.1.3模型参数拟合

x = np.random.gamma(6, size=200)sns.distplot(x, kde=False, fit=stats.gamma) 
1
2

png

2.2 双变量分布

mean, cov = [0, 1], [(1, .5), (.5, 1)]data = np.random.multivariate_normal(mean, cov, 200)df = pd.DataFrame(data, columns=["x", "y"]) 
1
2
3

两个相关的正态分布~

2.2.1 散点图

sns.jointplot(x="x", y="y", data=df) 
1

png

2.2.2 六角箱图

  • 在数据量很大的时候,用散点图来做可视化的时候效果不是很好,所以引入六角箱图做可视化。
x, y = np.random.multivariate_normal(mean, cov, 1000).Twith sns.axes_style("ticks"):    sns.jointplot(x=x, y=y, kind="hex") 
1
2
3

png

2.2.3 核密度估计

sns.jointplot(x="x", y="y", data=df, kind="kde") 
1

png

f, ax = plt.subplots(figsize=(6, 6))sns.kdeplot(df.x, df.y, ax=ax)sns.rugplot(df.x, color="g", ax=ax)sns.rugplot(df.y, vertical=True, ax=ax) 
1
2
3
4

png

更炫酷的效果:

f, ax = plt.subplots(figsize=(6, 6))cmap = sns.cubehelix_palette(as_cmap=True, dark=1, light=0)sns.kdeplot(df.x, df.y, cmap=cmap, n_levels=60, shade=True) 
1
2
3

png

先绘制图形图像,然后再往图中添加额外的效果。

g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")g.ax_joint.collections[0].set_alpha(0)g.set_axis_labels("$X$", "$Y$") 
1
2
3
4

png

2.3 数据集中的两两关系

2.3.1 散点图表示

iris = sns.load_dataset("iris")iris.head() 
1
2

sns.pairplot(iris) 
1

png

2.3.2 灰度图表示

g = sns.PairGrid(iris)g.map_diag(sns.kdeplot)g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=20) 
1
2
3

png

3. 变量间的关系

  • 这个部分主要是lmplot函数的运用。
%matplotlib inlineimport numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as snssns.set(color_codes=True)np.random.seed(sum(map(ord, "regression")))tips = sns.load_dataset("tips") 
1
2
3
4
5
6
7
8
9

3.1 绘制线性回归模型

3.1.1 连续的取值

最简单的方式:散点图 + 线性回归 + 95%置信区间

sns.lmplot(x="total_bill", y="tip", data=tips) 
1

png

3.1.2 离散变量

  • 对于变量离线取值,散点图绘制出来的效果并不好,很难看出各个数据的分布。为了看清数据的分布,一下有两种方式进行处理。
sns.lmplot(x="size", y="tip", data=tips) 
1

png

方法1:加个小的抖动

sns.lmplot(x="size", y="tip", data=tips, x_jitter=.08) 
1

png

方法2:离散取值上用均值和置信区间代替散点,求出均值和方差并在图上表示

sns.lmplot(x="size", y="tip", data=tips, x_estimator=np.mean) 
1

png

3.2 拟合不同模型

有些时候线性拟合效果不错,但有时数据的分布并不适合用线性方式拟合。

anscombe = sns.load_dataset("anscombe")sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"), ci=None, scatter_kws={
"s": 80})
1
2

png

如图,用线性拟合的方式效果不是很好

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), ci=None, scatter_kws={
"s": 80})
1

png

3.2.1 高阶拟合

  • 改用高阶拟合的方式:order = 2
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), order=2, ci=None, scatter_kws={
"s": 80})
1

png

3.2.2 异常值处理:

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"), robust=True, ci=None, scatter_kws={
"s": 80})
1

png

3.2.3 二值变量拟合

  • 二值变量拟合:对于运用线性来拟合效果并不是很好,所以一下运用logistic的方式对二类进行分类。
tips["big_tip"] = (tips.tip / tips.total_bill) > .15sns.lmplot(x="total_bill", y="big_tip", data=tips, y_jitter=.05) 
1
2

png

sns.lmplot(x="total_bill", y="big_tip", data=tips, logistic=True, y_jitter=.03, ci=None) 
1

png

3.2.3 残差曲线

sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'I'"), scatter_kws={
"s": 80})
1

png

拟合的好,就是白噪声的分布

拟合的差,就能看出一些模式

sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'II'"), scatter_kws={
"s": 80})
1

png

3.3 变量间的条件关系

# 指定hue参数sns.lmplot(x="total_bill", y="tip", hue = "day", data=tips) 
1
2

png

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, markers=["o", "x"]) 
1

png

尝试增加更多的分类条件

# hue与col配合sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips) 
1
2

png

# hue、col与row一起使用sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", row="sex", data=tips) 
1
2

png

3.4 控制图片的大小和形状

  • 多个图在同一个区域显示,默认的方式显示的图片可能会很小,所以需要对图片的大小进行控制。
sns.lmplot(x="total_bill", y="tip", col="day", data=tips, col_wrap=2, size=5) 
1

png

sns.lmplot(x="total_bill", y="tip", col="day", data=tips, aspect=0.5) 
1

png

4. 分类数据的可视化分析

  • 观测点的直接展示:swarmplot, stripplot
  • 观测近似分布的展示:boxplot, violinplot
  • 均值和置信区间的展示:barplot, pointplot
%matplotlib inlineimport numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as snssns.set(style="whitegrid", color_codes=True)np.random.seed(2017)titanic = sns.load_dataset("titanic")tips = sns.load_dataset("tips")iris = sns.load_dataset("iris") 
1
2
3
4
5
6
7
8
9
10
11
titanicsns.barplot(x="sex", y="survived", hue="class", data=titanic) 
1
2

png

4.1 分类散点图

当有一维数据是分类数据时,散点图成为了条带形状。

sns.stripplot(x="day", y="total_bill", data=tips) 
1

png

散点图绘制的时候很多点集中在一起,为了更清楚的表示,需要进行如下两种方法的操作。

法一:抖动。

sns.stripplot(x="day", y="total_bill", data=tips, jitter=True) 
1

png

法二:生成蜂群图,避免散点重叠

sns.swarmplot(x="day", y="total_bill", data=tips) 
1

png

在每一个一级分类内部可能存在二级分类

sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips) 
1

png

4.2 分类分布图

4.2.1 箱图

上边缘、上四分位数、中位数、下四分位数、下边缘

sns.boxplot(x="day", y="total_bill", hue="time", data=tips) 
1

png

4.2.2 图

箱图 + KDE(Kernel Distribution Estimation)

sns.violinplot(x="total_bill", y="day", hue="time", data=tips) 
1

png

sns.violinplot(x="day", y="total_bill", hue="time", data=tips) 
1

png

sns.violinplot(x="total_bill", y="day", hue="time", data=tips, bw=.1, scale="count", scale_hue=False) 
1
2

png

sns.violinplot(x="total_bill", y="day", hue="time", data=tips, bw=.1, scale="count", scale_hue=False) 
1

png

非对称提琴图

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True, inner="stick") 
1

png

4.3 分类统计估计图

4.3.1 统计柱状图

sns.barplot(x="sex", y="survived", hue="class", data=titanic) 
1

png

4.3.2 灰度柱状图

sns.countplot(x="deck", data=titanic) 
1

png

4.3.3 点图

sns.pointplot(x="sex", y="survived", hue="class", data=titanic) 
1

png

修改颜色、标记、线型

sns.pointplot(x="class", y="survived", hue="sex", data=titanic,              palette={
"male": "g", "female": "m"}, markers=["^", "o"], linestyles=["-", "--"])
1
2
3

png

4.4 分类子图

  • 通过调整factorplot的参数可以绘制出很多不同类型的图
sns.factorplot(x="day", y="total_bill", hue="smoker", col="time", data=tips, kind="swarm") 
1

png

多分类标准的子图

g = sns.PairGrid(tips,                 x_vars=["smoker", "time", "sex"],                 y_vars=["total_bill", "tip"],                 aspect=.75, size=3.5)# 对网格中的每一个图做violinplotg.map(sns.violinplot, palette="bright"); 
1
2
3
4
5
6

png

总结

通过seaborn对数据可视化可以看出数据的分布等情况。

更具体的代码。

参考文献:

原始地址:

Seaborn绘图

  • 全部代码:
  • 个人博客地址:

一、介绍与安装

1、介绍

  • 官网:
  • Github:
  • Seaborn 其实是在matplotlib的基础上进行了更高级的 API 封装,从而使得作图更加容易
  • 在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充

2、安装

  • 直接 pip3 install seaborn即可

二、分布图

1、distplot

  • 导入包
#-*- coding: utf-8 -*-import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as sns#%matplotlib inline  # 为了在jupyter notebook里作图,需要用到这个命令 
1
2
3
4
5
6
7
  • 加载 seaborn中的数据集:tips = sns.load_dataset('tips')
  • 分布图
    • kde是高斯分布密度图,绘图在0-1之间
    • hist是否画直方图
    • rug在X轴上画一些分布线
    • fit可以制定某个分布进行拟合
    • label legend时的值
    • axlabel制定横轴的说明
sns.distplot(tips['total_bill'], bins=None, hist=True, kde=False, rug=True, fit=None,             hist_kws=None, kde_kws=None, rug_kws=None,             fit_kws=None, color=None, vertical=False,             norm_hist=False, axlabel=None, label=None, ax=None)sns.plt.show() 
1
2
3
4
5
  • 拟合分布
    • 这里使用了gamma分布拟合
from scipy import statssns.distplot(tips.total_bill, fit=stats.gamma, kde=False)sns.plt.show() 
1
2
3

seaborn gamma分布拟合

2、kdeplot

  • 高斯概率密度图
    • data2可以是二维的分布
    • shade是否填充
    • kernel核函数,还有很多核函数,比如cos, biw
    • cumulative累积的作图,最后的值应该是接近1
    • gridsize多少个点估计
ax = sns.kdeplot(tips['total_bill'], data2=tips.tip, shade=False, vertical=False,                     kernel="gau", bw="scott",                     gridsize=100, cut=3, clip=None,                     legend=True, cumulative=False,                     shade_lowest=True, ax=None)    sns.plt.show() 
1
2
3
4
5
6

二维的分布

二、pairplot

1、两两作图

  • iris 为例
    • data: DataFrame格式的数据
    • hue: label类别对应的column name
    • vars: 指定feature的列名
    • kind: 作图的方式,可以是reg或scatter
    • diag_kind: 对角线作图的方式,可以是hist或kde
iris = sns.load_dataset('iris')    g = sns.pairplot(iris, hue='species', hue_order=None, palette=None,                      vars=list(iris.columns[0:-1]),                      x_vars=None, y_vars=None,                      kind="reg", diag_kind="hist",                      markers=['o','s','D'], size=1.5, aspect=1,                      dropna=True, plot_kws=None,                      diag_kws=None, grid_kws=None)    sns.plt.show() 
1
2
3
4
5
6
7
8
9

seaborn pairplot作图

三、stripplot和swarmplot

1、stripplot

  • tips为例,查看每天的数据信息
    • x: X轴数据
    • y: Y轴数据
    • hue: 区分不同种类数据的column name
    • data: DataFrame类型数据
    • jitter: 将数据分开点,防止重叠
tips = sns.load_dataset('tips')    ax = sns.stripplot(x='day', y='total_bill', hue=None, data=tips, order=None,                       hue_order=None, jitter=True,                       split=False, orient=None,                       color=None, palette=None, size=5,                       edgecolor="gray", linewidth=0,                       ax=None) 
1
2
3
4
5
6
7

stripplot 查看每天的数据信息

  • 查看关于性别消费的信息
ax = sns.stripplot(x='sex', y='total_bill', hue='day', data=tips, order=None,                       hue_order=None, jitter=True,                       split=False, orient=None,                       color=None, palette=None, size=5,                       edgecolor="gray", linewidth=0,                       ax=None) 
1
2
3
4
5
6

sripplot 查看敢于性别消费的信息

2、swarmplot

  • 与stripplot类似,只是数据点不会重叠 (适合小数据量)
tips = sns.load_dataset('tips')    ax = sns.swarmplot(x='sex', y='total_bill', hue='day', data=tips)    sns.plt.show() 
1
2
3

seaborn swarmplot

四、boxplot

1、boxplot示意图

box图

  • 函数
    • x, y:指定X轴,Y轴的columns name值
    • hue: 指定要区分的类别
tips = sns.load_dataset('tips')    ax = sns.boxplot(x='day', y='total_bill', hue=None, data=tips, order=None,                     hue_order=None, orient=None,                     color=None, palette=None,                     saturation=.75, width=.8,                     fliersize=5, linewidth=None,                     whis=1.5, notch=False, ax=None)    sns.plt.show() 
1
2
3
4
5
6
7
8

box图

- 可以和上面的stripplot一起用

tips = sns.load_dataset('tips')    ax = sns.boxplot(x='day', y='total_bill', hue=None, data=tips, order=None,                     hue_order=None, orient=None,                     color=None, palette=None,                     saturation=.75, width=.8,                     fliersize=5, linewidth=None,                     whis=1.5, notch=False, ax=None)    sns.stripplot(x='day', y='total_bill', hue=None, data=tips, order=None,                  hue_order=None, jitter=True, split=False,                  orient=None, color=None, palette=None,                  size=5, edgecolor="gray", linewidth=0,                  ax=None)    sns.plt.show() 
1
2
3
4
5
6
7
8
9
10
11
12
13

seaborn boxplot和stripplot

五、jointplot

1、jointplot

  • 联合作图
    • kind: 有scatter” | “reg” | “resid” | “kde” | “hex
tips = sns.load_dataset('tips')    from scipy import stats    g = sns.jointplot(x='total_bill', y='tip',                      data=tips, kind="reg",                       stat_func=stats.pearsonr,                       color=None, size=6, ratio=5,                       space=.2, dropna=True, xlim=None,                       ylim=None, joint_kws=None,                       marginal_kws=None, annot_kws=None)    sns.plt.show() 
1
2
3
4
5
6
7
8
9
10

jointplot

  • 可以在基础上再作图
    • plot_joint就是在联合分布上作图
    • plot_marginals就是在边缘分布上再作图
g = (sns.jointplot(x='total_bill', y='tip',data=tips).plot_joint(sns.kdeplot)) 
1
2

joint plot

六、violinplot

1、小提琴图,和boxplot很像

  • 对称的kde图
  • 中间的白点是中位数,黑色粗线对应分位数

小提琴图1

  • inner: 指定图里面用什么划分,有"box", "quartile", "point", "stick", None
    • quartile为四分位数划分
    • stick很像rug,就是可以看出密度情况
  • scale: 缩放每个图对应的area, 取值有 "area", "count", "width"
    • area指定每个有相同的area
    • count会按数量缩放(数量少的就比较窄扁
tips = sns.load_dataset('tips')    ax = sns.violinplot(x='day', y='total_bill',                         hue='smoker', data=tips, order=None,                         hue_order=None, bw="scott",                         cut=2, scale="area",                         scale_hue=True, gridsize=100,                         width=.8, inner="quartile",                         split=False, orient=None,                         linewidth=None, color=None,                         palette='muted', saturation=.75,                         ax=None)     sns.plt.show() 
1
2
3
4
5
6
7
8
9
10
11
12

小提琴图

七、pointplot, bar

1、pointplot

  • 点图
    • estimator:点的取值是,默认是np.mean
tips = sns.load_dataset('tips')    sns.pointplot(x='time', y='total_bill', hue='smoker', data=tips, order=None,                  hue_order=None, estimator=np.mean, ci=95,                  n_boot=1000, units=None, markers="o",                  linestyles="-", dodge=False, join=True,                  scale=1, orient=None, color=None,                  palette=None, ax=None, errwidth=None,                  capsize=None)    sns.plt.show() 
1
2
3
4
5
6
7
8
9

pointplot

2、barplot

  • 条形图
    • y轴是mean value,和点图其实差不多
tips = sns.load_dataset('tips')    sns.barplot(x='day', y='total_bill', hue='sex', data=tips, order=None,                hue_order=None, estimator=np.mean, ci=95,                n_boot=1000, units=None, orient=None,                color=None, palette=None, saturation=.75,                errcolor=".26", errwidth=None, capsize=None,                ax=None)    sns.plt.show() 
1
2
3
4
5
6
7
8

bar

3、countplot

tips = sns.load_dataset('tips')    sns.countplot(x='day', hue='sex', data=tips)    sns.plt.show()   
1
2
3

count

八、factorplot

1、可以通过这个函数绘制以上几种图

  • 指定kind即可,有point, bar, count, box, violin, strip
  • rowcol指定绘制的行数和列数,给出一个种类类型的列名即可
titanic = sns.load_dataset('titanic')    sns.factorplot(x='age', y='embark_town',                    hue='sex', data=titanic,                   row='class', col='sex',                    col_wrap=None, estimator=np.mean, ci=95,                    n_boot=1000, units=None, order=None,                    hue_order=None, row_order=None,                    col_order=None, kind="box", size=4,                    aspect=1, orient=None, color=None,                    palette=None, legend=True,                    legend_out=True, sharex=True,                    sharey=True, margin_titles=False,                    facet_kws=None)    sns.plt.show() 
1
2
3
4
5
6
7
8
9
10
11
12
13
14

factorplot box

九、heatmap

1、heatmap

flight = sns.load_dataset('flights')    flights = flight.pivot('month','year','passengers')    sns.heatmap(flights, annot=True, fmt='d')    sns.plt.show() 
1
2
3
4

heatmap

十、时序绘图

1、tsplot

  • condition: 和hue差不多,指定类别
  • estimator: 默认为np.mean
gammas = sns.load_dataset('gammas')    sns.tsplot(data=gammas, time='timepoint', unit='subject',                condition='ROI', value='BOLD signal',                err_style="ci_band", ci=68, interpolate=True,                color=None, estimator=np.mean, n_boot=5000,                err_palette=None, err_kws=None, legend=True,                ax=None)    sns.plt.show() 
1
2
3
4
5
6
7
8

tsplot

原始地址:

转载地址:http://qqyws.baihongyu.com/

你可能感兴趣的文章
href="javascript:void(0)"
查看>>
h:panelGrid、h:panelGroup标签学习
查看>>
f:facet标签 的用法
查看>>
<h:panelgroup>相当于span元素
查看>>
java中append()的方法
查看>>
必学高级SQL语句
查看>>
经典SQL语句大全
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
log日志记录是什么
查看>>
<rich:modelPanel>标签的使用
查看>>
<h:commandLink>和<h:inputLink>的区别
查看>>
<a4j:keeyAlive>的英文介绍
查看>>
关于list对象的转化问题
查看>>
VOPO对象介绍
查看>>
suse创建的虚拟机,修改ip地址
查看>>
linux的挂载的问题,重启后就挂载就没有了
查看>>
docker原始镜像启动容器并创建Apache服务器实现反向代理
查看>>
docker容器秒死的解决办法
查看>>
管理网&业务网的一些笔记
查看>>
openstack报错解决一
查看>>