数据分析---数据可视化Seaborn的使用

Seaborn的使用

简介

Seaborn 是以 matplotlib为底层,更容易定制化作图的Python库。

Seaborn 其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易。

在大多数情况下使用Seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图,换句话说,matplotlib更加灵活,可定制化,而seaborn像是更高级的封装,使用方便快捷。

应该把Seaborn视为matplotlib的补充,而不是替代物。

安装

pip install seaborn

背景风格管理

除了各种绘图方式外,图形的美观程度可能是我们最关心的了。将它放到第一部分,因为风格设置是一些通用性的操作,对于各种绘图方法都适用。

Seaborn支持的风格有5种:

  • darkgrid 黑背景-白格
  • whitegrid 白背景-白格
  • dark 黑背景
  • white 白背景
  • ticks

设置风格的方法:

  • set()
  • set_style(value) 统一设置
  • axes_style(value) 单一设置
from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns

# 获取数据
xiao_mi = np.random.randint(50, 100, size=10)
hua_wei = np.random.randint(50, 100, size=10)
x = range(10)

with sns.axes_style('darkgrid'):
    plt.subplot(2,3,1)
    plt.plot(x, xiao_mi)
with sns.axes_style('whitegrid'):
    plt.subplot(2,3,2)	
    plt.plot(x, xiao_mi)
with sns.axes_style('dark'):
    plt.subplot(2,3,3)
    plt.plot(x, xiao_mi)
with sns.axes_style('white'):
    plt.subplot(2,3,4)
    plt.plot(x, xiao_mi)
    
sns.set_style('ticks')
plt.subplot(2,3,5)
plt.plot(x, xiao_mi)
plt.show()

注意事项: 修改样式要在填充数据之前

移除轴脊柱

whiteticks两个风格都能够移除顶部和右侧的不必要的轴脊柱。通过matplotlib参数是做不到这一点的,但是你可以使用seaborndespine()方法来移除它们

sns.despine()

注意事项: 移除轴脊柱要在 填充数据之后,在显示图表之前

图像风格管理

这会影响标签的大小,线条和绘图的其他元素,但不会影响整体样式。一组独立的参数控制绘图元素的比例,这应该允许您使用相同的代码来制作适合在适合使用较大或较小绘图的设置中的绘图。

首先让我们通过调用重置默认参数set()

  • set()

  • set_context()

    四个预设上下文中,在相对大小的顺序,是papernotebooktalk,和poster。该notebook样式是默认的,并且在上面的图表中使用。

sns.set_context("paper",font_scale=0.5, rc={"lines.linewidth": 1})
# font_scale 设置文字,rc 设置线条的粗细

sinplot()

调色板

颜色比图形样式的其他方面更重要,因为如果有效使用颜色可以更凸显示数据的结果与重要

Seaborn可以轻松选择和使用适合您正在使用的数据类型的调色板以及您可视化的目标

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
  • color_palette()能传入任何Matplotlib所支持的颜色
  • color_palette()不写参数则,默认颜色 deep, muted, pastel, bright, dark, colorblind(圆形颜色系统)
  • color_palette() flatui = ["#9b59b6", “#3498db”, “#95a5a6”, “#e74c3c”, “#34495e”, “#2ecc71”]
  • light_palette()
  • dark_palette()
  • set_palette()设置所有图的颜色
调色板
current_palette = sns.color_palette()
sns.palplot(current_palette)
plt.show()

[外链图片转存失败(img-gWBahBo8-1567675259225)(https://note.youdao.com/yws/api/personal/file/WEB6e199eb6707cf78ead5112b9d0108c68?method=download&shareKey=e153fe7e08c25e40bfb76f305fbdb0f5)]

current_palette = sns.color_palette()
sns.palplot(current_palette) #10个色块
sns.palplot(sns.color_palette('hl	s',8))#8个颜色,色度比较亮
plt.show()

[外链图片转存失败(img-m8jTzxMZ-1567675259226)(https://note.youdao.com/yws/api/personal/file/WEBc69497b873583d3301d3f8ec9c8a8439?method=download&shareKey=399897c141ecc19d2dff495c92bee6c3)]

[外链图片转存失败(img-dt0kcw36-1567675259227)(https://note.youdao.com/yws/api/personal/file/WEB680e0e3b2c4ecf55aaaec136a82eed8d?method=download&shareKey=e440b7cb18023d523de637b14e84ad7b)]

连续的调色板
sns.palplot(sns.color_palette('Blues'))
sns.palplot(sns.color_palette('Greens_r')) #参数里可以输入数字,指定颜色的块数,_r由		深到浅
plt.show()

[外链图片转存失败(img-w6dLRKql-1567675259228)(https://note.youdao.com/yws/api/personal/file/WEB52aa4b9c53bb690a2fc383786188a295?method=download&shareKey=9d802e5dda753e178c706bc91ec788d7)]

[外链图片转存失败(img-cZFdLg9w-1567675259228)(https://note.youdao.com/yws/api/personal/file/WEB15f6e557a3ee10492502cac64c6b684e?method=download&shareKey=9aa4e6600f3d78722562d15d7ea74aca)]

自定义连续调色板
sns.palplot(sns.light_palette('green'))
sns.palplot(sns.dark_palette('purple'))
plt.show()

[外链图片转存失败(img-mxbnryeG-1567675259229)(https://note.youdao.com/yws/api/personal/file/WEBf73413bda4c9e698bbef0825b4bfd5ae?method=download&shareKey=e496889a241a4fada5d13582ffd5cf59)]

[外链图片转存失败(img-UYZjfgt9-1567675259229)(https://note.youdao.com/yws/api/personal/file/WEB53e3707b620f32b1548451be717db122?method=download&shareKey=967f1926c2cf951fb768267ec75e5d57)]

xkcd_rgb 颜色

Xkcd_rgb这产生了一组954种命名颜色,您现在可以使用xkcd_rgb在seaborn中引用它们

sns.xkcd_rgb["pale red"], lw=3)
plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3)
线性调色板
色板的应用
sns.set_style('whitegrid') #dark;white;
data = np.random.normal(size=(20,8))+np.arange(8)/2 #正态分布 loc均值,scale标准差,size20行8列数据
sns.boxplot(data=data,palette=sns.color_palette('hls',8))
plt.show()
plt.bar(x,x,color=sns.color_palette('Reds'))
plt.show()

单变量

当我们做分析时,一般会看下单数据的分布情况,也就是但变量的分析与统计。

distplot 直方图
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, 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)

bins → 箱数

hist、ked、rug → bool,是否显示箱/密度曲线/数据分布

norm_hist → 直方图是否按照密度来显示,如果为False,显示计数

_kws:字典,对应部分的各种参数。

vertical → 是否水平显示

fit → 可结合scipy库在图像上做拟合

label → 图例

axlabel → x轴标注

import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt

import seaborn as sns
sns.set()
x = np.random.normal(size=100)
sns.distplot(x,kde=False)
#sns.distplot(x, bins=20, kde=False) 设置多少个分组
sns.distplot(x, kde=False)
jointplot 散点图

联合概率分布简称联合分布,是两个及以上随机变量组成的随机向量的概率分布。根据随机变量的不同,联合概率分布的表示形式也不同。对于离散型随机变量,联合概率分布可以以列表的形式表示,也可以以函数的形式表示;对于连续型随机变量,联合概率分布通过一非负函数的积分表示:

seaborn.jointplot(x, y, data=None, kind='scatter', stat_func=None, color=None, 
height=6, ratio=5, space=0.2, dropna=True, xlim=None, ylim=None, joint_kws=None,
marginal_kws=None, annot_kws=None, **kwargs)

参数:

x,y:为DataFrame中的列名或者是两组数据,data指向dataframe;
kind : { “scatter” | “reg” | “resid” | “kde” | “hex” }。默认散点图;
stat_func:用于计算统计量关系的函数;
ratio:中心图与侧边图的比例,越大、中心图占比越大;
dropna:去除缺失值;
height:图的尺度大小(正方形);
space:中心图与侧边图的间隔大小;
xlim,ylim:x,y的范围

# 生成 多元高斯正太分布 的数据
# 多元高斯正太分布是一堆正太分布向更多维度的推广,这种分布由其均值和协方差矩阵来确定
data = np.random.multivariate_normal([0,1], [(1,0.5),(0.5,1)], 1000) # 均值, [(1,0.5),(0.5,1)]协方差对称阵
df = pd.DataFrame(data,columns=['x','y'])
with sns.axes_style("white"):
    sns.jointplot(x='x', y='y',data=df)
plt.show()
pairplot

该函数会同时绘制数据中所有特征两两之间的关系图.因为pairplot是建立在pairgrid之上,所以可以将中间的很多函数进行变换,例如下面的kde的例子。

默认对角线histgram,非对角线kdeplot

seaborn.pairplot(data, hue=None, hue_order=None, palette=None, vars=None, 
x_vars=None, y_vars=None, kind='scatter', diag_kind='auto', markers=None,
height=2.5, aspect=1, dropna=True, plot_kws=None, diag_kws=None, grid_kws=None, size=None)

参数:

var:data中的子集,否则使用data中的每一列;
x_vars / y_vars:可以具体细分,谁与谁比较;
kind:{‘scatter’, ‘reg’};
diag_kind:{‘auto’, ‘hist’, ‘kde’}。单变量图(自己与自己比较)的绘图,对角线子图的图样。默认情况取决于是否使用“hue”。

iris=sns.load_dataset('iris')  #导入经典的鸢尾花数据	
sns.pairplot(iris);

回归分析图

当得到数据时,我可以对连续性的值,可以做一些回归关系的绘制与展示。

lmplot(回归图)

许多数据集都有着众多连续变量。数据分析的目的经常就是衡量变量之间的关系,lmplot() 是一个非常有用的方法,它会在绘制二维散点图时,自动完成回归拟合。

seaborn.lmplot(x, y, data, hue=None, col=None, row=None, palette=None, 
col_wrap=None, height=5, aspect=1, markers='o', sharex=True, sharey=True, 
hue_order=None, col_order=None, row_order=None, legend=True, legend_out=True, 
x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, 
n_boot=1000, units=None, order=1, logistic=False, lowess=False, robust=False, 
logx=False, x_partial=None, y_partial=None, truncate=False, x_jitter=None, 
y_jitter=None, scatter_kws=None, line_kws=None, size=None)

col,row:和前面一样,根据所指定属性在列,行上分类;
col_wrap:指定每行的列数,最多等于col参数所对应的不同类别的数量;
aspect:控制图的长宽比;
x_jitter,y_jitter:给x,y轴随机增加噪音点,设置这两个参数不影响最后的回归直线;
order:多项式回归,控制进行回归的幂次,设定指数,可以用多项式拟合;
logistic:逻辑回归;
robust:如果是True,使用statsmodels来估计一个稳健的回归(鲁棒线性模型)。这将减少异常值。请注意 logistic回归和robust回归相较于简单线性回归需要更大的计算量,其置信区间的产生也依赖于bootstrap采样,你可以关掉置信区间估计来提高速度(ci=None);
lowess:如果是True,使用statsmodels来估计一个非参数的模型(局部加权线性回归)。这种方法具有最少的假设,尽管它是计算密集型的,但目前无法为这类模型绘制置信区间;
logx:转化为log(x)
truncate:默认情况下,绘制散点图后绘制回归线以填充x轴限制。如果为True,则它将被数据限制所限制;
绘制一个第三个变量的条件,并绘制不同颜色的回归图。

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

[外链图片转存失败(img-DLPW0F9T-1567675259231)(C:\Users\Administrator\Desktop\seaborn图例/20190124165857665.png)]

将变量分为多行,并改变大小:

g = sns.lmplot(x="total_bill", y="tip", col="day", hue="day",data=tips,
col_wrap=2, height=4)

[外链图片转存失败(img-RrbVc6jP-1567675259232)(C:\Users\Administrator\Desktop\seaborn图例/20190124170229831.png)]

regplot()

regplot()和lmplot()都可以绘制线性回归曲线。这两个函数非常相似,甚至共有一些核心功能。具体参数如下:

seaborn.regplot(x, y, data=None, x_estimator=None, x_bins=None, x_ci='ci', 
scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, order=1, logistic=False, 
lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, 
truncate=False, dropna=True, x_jitter=None, y_jitter=None, label=None, color=None, 
marker='o', scatter_kws=None, line_kws=None, ax=None)

具体绘图如下:

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

[外链图片转存失败(img-6lEnB3uT-1567675259233)(C:\Users\Administrator\Desktop\seaborn图例/regplot.jpg)]

regplot 和 Implot 的区别:

  • sns.lmplot() 功能多,规范多

  • sns.regplot() 推荐,支持的参数与数据类型比较多一些

regplot 详细演示代码如下:

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
# 准备数据
tips = sns.load_dataset("tips")
tips.head()
sns.regplot(x="total_bill", y="tip", data=tips)

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

sns.regplot(data=tips,x="size",y="tip")

sns.regplot(x="size", y="tip", data=tips, x_jitter=.05)

多变量分析绘图

# 准备数据
import matplotlib.pyplot as plt
import seaborn as sns
tips = sns.load_dataset("tips")
# 花装图
sns.swarmplot(x="day", y="total_bill", data=tips)

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

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

[外链图片转存失败(img-YtIiF6fn-1567675259234)(C:\Users\Administrator\Desktop\seaborn图例/花装图swarmplot.png)]

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

[外链图片转存失败(img-sT0a49ZM-1567675259235)(C:\Users\Administrator\Desktop\seaborn图例/散点图stripplot.png)]

​ 散点图stripplot

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

[外链图片转存失败(img-RuyFCmEx-1567675259235)(C:\Users\Administrator\Desktop\seaborn图例\boxplot.png)]

# 小提琴图
sns.violinplot(x="total_bill", y="day", hue="time", data=tips)

[外链图片转存失败(img-1mdEtbsr-1567675259236)(C:\Users\Administrator\Desktop\seaborn图例\小提琴图violinplot.png)]

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True)
# 结合使用
sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5)

[外链图片转存失败(img-ZRaRC9qn-1567675259236)(C:\Users\Administrator\Desktop\seaborn图例\结合图示.png)]

titanic= sns.load_dataset('titanic')
#条形图
sns.barplot(x="sex", y="survived", hue="class", data=titanic)
# 点图
sns.pointplot(x="sex", y="survived", hue="class", data=titanic)

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

# 多功能方法
sns.catplot(x="day", y="total_bill", hue="smoker", data=tips)

sns.catplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar")

sns.catplot(x="day", y="total_bill", hue="smoker",
               col="time", data=tips, kind="swarm")

sns.catplot(x="time", y="total_bill", hue="smoker",
               col="day", data=tips, kind="box", size=4, aspect=.5)
seaborn.catplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind='point', 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, **kwargs)

Parameters:

  • x,y,hue 数据集变量 变量名
  • date 数据集 数据集名
  • row,col 更多分类变量进行平铺显示 变量名
  • col_wrap 每行的最高平铺数 整数
  • estimator 在每个分类中进行矢量到标量的映射 矢量
  • ci 置信区间 浮点数或None
  • n_boot 计算置信区间时使用的引导迭代次数 整数
  • units 采样单元的标识符,用于执行多级引导和重复测量设计 数据变量或向量数据
  • order, hue_order 对应排序列表 字符串列表
  • row_order, col_order 对应排序列表 字符串列表
  • kind : 可选:point 默认, bar 柱形图, count 频次, box 箱体, violin 提琴, strip 散点,swarm 分散点 size 每个面的高度(英寸) 标量 aspect 纵横比 标量 orient 方向 “v”/“h” color 颜色 matplotlib颜色 palette 调色板 seaborn颜色色板或字典 legend hue的信息面板 True/False legend_out 是否扩展图形,并将信息框绘制在中心右边 True/False share{x,y} 共享轴线 True/False

FacetGrid

FacetGrid当您想要在数据集的子集中分别可视化变量的分布或多个变量之间的关系时,该类非常有用。

当想把数据中的多个子集展示出来时,可以使用FacetGrid,步骤如下:

  • 绘画区域
  • 使用方法绘画数据

FacetGrid常用参数:

  • height 高
  • aspect 宽
  • palette 色板
  • col 分图属性(列)
  • row 分图属性(行)
  • hue 属性分类
  • margin_titles
  • size 图的大小,已被height 替代
  • row_order 显示分图的数据
  • hue_kws 显示图标记的形状(散点)

准备数据:

tips = sns.load_dataset("tips")
tips.head()

绘图

# 绘画区域
g = sns.FacetGrid(tips, col="time")
#----------------- 绘画直方图-----------------
g.map(plt.hist, "tip");

#----------------- 绘画散点图-------------------
g = sns.FacetGrid(tips, col="sex", hue="smoker") # 根据性别分类多图, 显示出2部分数据
g.map(plt.scatter, "total_bill", "tip", alpha=.7) 
g.add_legend(); #增加图例

#----------------- 绘画散点图-------------------
pal = dict(Lunch="seagreen", Dinner="gray")
g = sns.FacetGrid(tips, hue="time", palette=pal, size=5)
g.map(plt.scatter, "total_bill", "tip", s=50, alpha=.7, linewidth=.5, edgecolor="white")
g.add_legend();

#----------------- 绘画散点图-------------------
g = sns.FacetGrid(tips, hue="sex", palette="Set1", size=5, hue_kws={"marker": ["^", "v"]})
g.map(plt.scatter, "total_bill", "tip", s=100, linewidth=.5, edgecolor="white")
g.add_legend();


#------------------回归分析图-----------------
g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=True)
g.map(sns.regplot, "size", "total_bill", color=".1", fit_reg=False, x_jitter=.1)

#------------------条形图-----------------
g = sns.FacetGrid(tips, col="day", size=4, aspect=.5)
g.map(sns.barplot, "sex", "total_bill");

#------------------盒形图-----------------
from pandas import Categorical
ordered_days = tips.day.value_counts().index
print (ordered_days)

ordered_days = Categorical(['Thur', 'Fri', 'Sat', 'Sun'])
g = sns.FacetGrid(tips, row="day", row_order=ordered_days,size=1.7, aspect=4,)# aspect  纵横比
g.map(sns.boxplot, "total_bill");

with sns.axes_style("white"):
    g = sns.FacetGrid(tips, row="sex", col="smoker", margin_titles=True, size=2.5)
    g.map(plt.scatter, "total_bill", "tip", color="#334488", edgecolor="white", lw=.5);
    g.set_axis_labels("Total bill (US Dollars)", "Tip");
    g.set(xticks=[10, 30, 50], yticks=[2, 6, 10]); # 改x轴和y轴标尺
    g.fig.subplots_adjust(wspace=.02, hspace=.02);
#g.fig.subplots_adjust(left  = 0.125,right = 0.5,bottom = 0.1,top = 0.9, wspace=.02, hspace=.02)

热力图

热力图可以显示多个数据的走势与规律,并可以快速到到大值的与最小值所在位置

  • data:矩阵数据集,可以使numpy的数组(array),如果是pandas的dataframe,则df的index/column信息会分别对应到heatmap的columns和rows
  • linewidths,热力图矩阵之间的间隔大小
  • vmax,vmin, 图例中最大值和最小值的显示值,没有该参数时默认不显示
  • cmap:matplotlib的colormap名称或颜色对象;如果没有提供,默认为cubehelix map (数据集为连续数据集时) 或 RdBu_r (数据集为离散数据集时)
  • center:将数据设置为图例中的均值数据,即图例中心的数据值;通过设置center值,可以调整生成的图像颜色的整体深浅;设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变
  • xticklabels: 如果是True,则绘制dataframe的列名。如果是False,则不绘制列名。如果是列表,则绘制列表中的内容作为xticklabels。 如果是整数n,则绘制列名,但每个n绘制一个label。 默认为True。
  • yticklabels: 如果是True,则绘制dataframe的行名。如果是False,则不绘制行名。如果是列表,则绘制列表中的内容作为yticklabels。 如果是整数n,则绘制列名,但每个n绘制一个label。 默认为True。默认为True.
  • fmt,格式设置
import seaborn as sns
from matplotlib import pyplot as plt
import numpy as np

# 注备数据
uniform_data = np.random.rand(3, 3)
print (uniform_data)
heatmap = sns.heatmap(uniform_data)

ax = sns.heatmap(uniform_data, vmin=0.2, vmax=0.5) #设置最大值,也最小值

normal_data = np.random.randn(3, 3)
print (normal_data)
ax = sns.heatmap(normal_data, center=0)

# 航班数据
flights = sns.load_dataset("flights")
flights.head()
# 转换数据
flights = flights.pivot("month", "year", "passengers")
print (flights)
ax = sns.heatmap(flights)
# 绘画数据
ax = sns.heatmap(flights, annot=True,fmt="d") # 显示数字,并以10进制显示

ax = sns.heatmap(flights, linewidths=.5) # 设置边距

ax = sns.heatmap(flights, cmap="YlGnBu") # 设置颜色
ax = sns.heatmap(flights, cbar=False) #设置右边的图例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值