Seaborn 可视化

Seaborn 可视化

1.简介

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

2. seaborn入门

2.1 单变量分布

%matplotlib inline
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
2.1.1 灰度图

最方便快捷的方式~

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

png

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

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

png

使用rug生成实例:

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

png

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

2.1.2 核密度估计

通过观测估计概率密度函数的形状。
有什么用呢?待定系数法求概率密度函数~

核密度估计的步骤:
* 每一个观测附近用一个正态分布曲线近似
* 叠加所有观测的正太分布曲线
* 归一化

在seaborn中怎么画呢?

sns.kdeplot(x)

png

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

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

png

2.1.3模型参数拟合
x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma)

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"])

两个相关的正态分布~

2.2.1 散点图
sns.jointplot(x="x", y="y", data=df)

png

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

png

2.2.3 核密度估计
sns.jointplot(x="x", y="y", data=df, kind="kde")

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)

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)

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$")

png

2.3 数据集中的两两关系

2.3.1 散点图表示
iris = sns.load_dataset("iris")
iris.head()

sns.pairplot(iris)

png

2.3.2 灰度图表示
g = sns.PairGrid(iris)
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=20)

png

3. 变量间的关系

  • 这个部分主要是lmplot函数的运用。
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "regression")))
tips = sns.load_dataset("tips")

3.1 绘制线性回归模型

3.1.1 连续的取值

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

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

png

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

png

方法1:加个小的抖动

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

png

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

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

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})

png

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

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

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})

png

3.2.2 异常值处理:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"), robust=True, ci=None, scatter_kws={"s": 80})

png

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

png

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

png

3.2.3 残差曲线
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'I'"), scatter_kws={"s": 80})

png

拟合的好,就是白噪声的分布 N(0,σ2) N ( 0 , σ 2 )
拟合的差,就能看出一些模式

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

png

3.3 变量间的条件关系

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

png

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

png

尝试增加更多的分类条件

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

png

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

png

3.4 控制图片的大小和形状

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

png

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

png

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

  • 观测点的直接展示:swarmplot, stripplot
  • 观测近似分布的展示:boxplot, violinplot
  • 均值和置信区间的展示:barplot, pointplot
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
sns.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")
titanic
sns.barplot(x="sex", y="survived", hue="class", data=titanic)

png

4.1 分类散点图

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

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

png

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

法一:抖动。

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

png

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

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

png

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

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

png

4.2 分类分布图

4.2.1 箱图

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

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

png

4.2.2 提琴图

箱图 + KDE(Kernel Distribution Estimation)

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

png

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

png

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

png

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

png

非对称提琴图

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

png

4.3 分类统计估计图

4.3.1 统计柱状图
sns.barplot(x="sex", y="survived", hue="class", data=titanic)

png

4.3.2 灰度柱状图
sns.countplot(x="deck", data=titanic)

png

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

png

修改颜色、标记、线型

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

png

4.4 分类子图

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

png

多分类标准的子图

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

png

总结

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

更具体的代码这里

参考文献:

寒老师课件

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 目录 1. 目录 2 2. 绘图函数Plotting functions 4 2.1. 可视化的统计关系Visualizing statistical relationships 4 2.1.1. 用散点图联系变量Relating variables with scatter plots 4 2.1.2. 强调线条图的连续性Emphasizing continuity with line plots 10 2.1.3. 显示与切面的多个关系Showing multiple relationships with facets 21 2.2. 分类数据绘图Plotting with categorical data 24 2.2.1. 分类散点图Categorical scatterplots 26 2.2.2. 分类观测值分布Distributions of observations within categories 31 2.2.3. 分类统计估计Statistical estimation within categories 37 2.2.4. 对“wide-form”数据作图Plotting “wide-form” data 41 2.2.5. 显示与facet的多个关系Showing multiple relationships with facets 43 2.3. 可视化数据集的分布Visualizing the distribution of a dataset 44 2.3.1. 绘制单变量分布Plotting univariate distributions 45 2.3.2. 绘制二元分布Plotting bivariate distributions 51 2.3.3. 在数据集中可视化成对关系Visualizing pairwise relationships in a dataset 55 2.4. 可视化线性关系Visualizing linear relationships 57 2.4.1. 函数绘制线性模型Functions to draw linear regression models 58 2.4.2. 拟合不同种类的模型Fitting different kinds of models 61 2.4.3. 在其他变量上的情况Conditioning on other variables 68 2.4.4. 控制图表的大小和形状Controlling the size and shape of the plot 71 2.4.5. 在其他上下文中绘制回归图Plotting a regression in other contexts 73 3. 多图网格Multi-plot grids 76 3.1. 构建结构化的多图网格Building structured multi-plot grids 76 3.2. 有条件的小倍数Conditional small multiples 77 3.3. 使用定制函数Using custom functions 86 3.4. 绘制成对的数据关系Plotting pairwise data relationships 90 4. 绘图美学Plot aesthetics 99 4.1. 控制图表美学Controlling figure aesthetics 99 4.1.1. Seaborn图表风格Seaborn figure styles 101 4.1.2. 删除轴上的小凸起Removing axes spines 104 4.1.3. 临时设置图表样式Temporarily setting figure style 105 4.1.4. 覆盖Seaborn样式的元素Overriding elements of the seaborn styles 106 4.1.5. 缩放图表元素Scaling plot elements 108 4.2. 选择调色板Choosing color palettes 111 4.2.1. 创建颜色调色板Building color palettes 111 4.2.2. 定性调色板Qualitative color palettes 112 4.2.3. 连续调色板Sequential color palettes 116 4.2.4. 不同颜色的调色板Diverging color palettes 122 4.2.5. 设置默认调色板Setting the default color palette 124 5. 教程中的数据集 125

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值