seaborn简介

seabornmatplotlib一样,是Python进行数据可视化分析的重要第三方包。但seaborn是在matplotlib的基础上进行了更高级的API封装。使用seaborn,可以在不需要了解那么多底层参数的情况下,同样能够画出比较好看的图表。

seaborn使用

安装&导入

首先确定你的电脑已安装以下应用

  • Python 2.7+ or Python 3
  • Pandas
  • Matplotlib
  • Seaborn
  • Jupyter Notebook(可选)
1
jupyter notebook

出现jupyternotebook的界面,即可进行代码编写:

导入相关包:

1
2
3
4
5
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

seaborn绘图风格

首先定义一个简单的方程来绘制一些偏置的正弦波:

1
2
3
4
def sinplot(flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, 7):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)

matplotlib默认会绘制如下:

1
sinplot()

转换为seaborn默认绘图,可以简单的用set()方法。

1
2
sns.set()
sinplot()

有五种seaborn的风格,它们分别是:

  • darkgrid(默认)
  • whitegrid
  • dark
  • white
  • ticks

另外可以自己设置相关配置:

1
2
sns.set_style("darkgrid", {"axes.facecolor": ".9"})
sinplot()

数据可视化demo

对数据的可视化操作,乍看起来很复杂,其实种类总结起来可以分为下面几种:

  • 单变量分布可视化(displot)
  • 双变量分布可视化(jointplot)
  • 数据集中成对双变量分布(pairplot)
  • 双变量-三变量散点图(relplot)
  • 双变量-三变量连线图(relplot)
  • 双变量-三变量简单拟合
  • 分类数据的特殊绘图

单变量分布

单变量分布可视化是通过将单变量数据进行统计从而实现画出概率分布的功能,同时概率分布有直方图概率分布曲线两种形式。
利用displot()对单变量分布画出直方图(可以取消),并自动进行概率分布的拟合(也可以使用参数取消)。

1
2
3
sns.set_style('darkgrid')
x = np.random.randn(300)
sns.distplot(x);

还可以使用sns.kdeplot()画出核密度估计图。核密度估计是概率论上用来估计未知的密度函数,属于非参数检验,通过核密度估计图可以比较直观的看出样本数据本身的分布特征。

1
2
3
x=np.random.randn(100)
#是否进行阴影处理
sns.kdeplot(x,shade=True,color="g")

二元kde图像,很少使用,稍微了解一下即可:

1
2
3
4
#x,y
y=np.random.randn(100)
#cbar:参数若为True,则会添加一个颜色棒(颜色帮在二元kde图像中才有)
sns.kdeplot(x,y,shade=True,cbar=True)

双变量分布

双变量分布通俗来说就是分析两个变量的联合概率分布和每一个变量的分布。

1
2
3
4
5
import pandas as pd
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(x="x", y="y", data=df);
1
2
# 同样可以使用曲线来拟合分布密度
sns.jointplot(x="x", y="y", data=df, kind="kde");

数据集中成对双变量分析

1
2
3
# 对角线化的是单变量的分布
iris = sns.load_dataset("iris")
sns.pairplot(iris);

可以进行一些配置:

  • hue——》指定分类变量
  • markers——》使用不同的形状
1
g1 = sns.pairplot(iris, hue="species", markers=["o", "s", "D"])

还有其他配置如下:

  • 使用调色板
  • 使用 KDE
  • 使用回归
1
2
3
g2 = sns.pairplot(iris, hue="species", palette="husl")
g3 = sns.pairplot(iris, diag_kind="kde")
g4 = sns.pairplot(iris, kind="reg")

双变量-三变量散点图

这里使用tips数据集:

1
2
3
4
tips = sns.load_dataset("tips")
sns.relplot(x="total_bill", y="tip", data=tips);
# 除了画出双变量的散点图外,还可以利用颜色来增加一个维度将点分离开
sns.relplot(x="total_bill", y="tip", hue="smoker", data=tips);

通过hue设置来进行区分

简单线性拟合

主要用regplot()进行画图,这个函数绘制两个变量的散点图,x和y,然后拟合回归模型并绘制得到的回归直线和该回归一个95%置信区间。
(不过一般这种工作可以用sklearn来做)

1
2
sns.set_style('darkgrid')
sns.regplot(x="total_bill", y="tip", data=tips);

线性模型对某些数据可能适应不够好,可以使用高阶模型拟合,也可以删除部分数据:

1
2
3
4
5
6
# 利用order2阶模型来拟合
sns.regplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),ci=None,order = 2);
# 如果数据中有明显错误的数据点可以进行删除
sns.regplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),ci=None);
plt.figure()
sns.regplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),ci=None,robust = True);

热力图

取出三个特征进行热力图的绘制figures.pivot() 其中第三个属性表示热力图上实际的值。
常用设置:

  • annot:是否显示数值注释
  • fmt:format的缩写,设置数值的格式化形式
  • linewidths:热力图矩阵之间的间隔大小
  • vmax,vmin:图例中最大值和最小值的显示值,没有该参数时默认不显示
  • cmap:matplotlib的colormap名称或颜色对象;如果没有提供,默认为:
    • cubehelix map (数据集为连续数据集时)
    • RdBu_r (数据集为离散数据集时)
  • xticklabels, yticklabels:绘制dataframe的行列名
1
2
3
4
5
6
7
8
9
10
11
12
flights = sns.load_dataset('flights')
# 取出这三个属性画热力图,坐标点的位置是passengers
flights = flights.pivot('month', 'year', 'passengers')
ax = sns.heatmap(flights)
plt.show()

# 将实际的数值绘制到上面
flights = sns.load_dataset('flights')
# 取出这三个属性画热力图,坐标点的位置是passengers
flights = flights.pivot('month', 'year', 'passengers')
ax = sns.heatmap(flights, annot=True, fmt='d')
plt.show()
1
2
plt.figure(figsize=(10,6))
ax = sns.heatmap(flights, fmt='d', linewidths=.5, cmap='YlGnBu')