目录

前言

相关案例与解析

写在最后:


前言

Matplotlib绘图基本模仿MATLAB绘图库,其绘图风格和MATLAB类似。由于MATLAB绘图风格偏古典,因此,Python开源社区开发了Seaborn绘图模块,对Matplotlib进行封装,绘图效果更符合现代人的审美。

Seaborn属于Matplotlib的一个高级接口,使得作图更加容易。在多数情况下使用Seaborn能做出很具吸引力的图,而使用Matplotlib可以制作具有更多特色的图。应该把Seaborn视为Matplotlib的补充,而不是替代物。

使用Seaborn时,使用的导入惯例为:

import seaborn as sns

风格设置用以设置绘图的背景色、风格、字型、字体等。

Seaborn通过set函数实现风格设置。

seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)

相关案例与解析

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings#引入警告信息库
warnings.filterwarnings('ignore')#过滤警告信息

 
Matplotlib绘图基本模仿MATLAB绘图库,其绘图风格和MATLAB类似。由于MATLAB绘图风格偏古典,因此,Python开源社区开发了Seaborn绘图模块,对Matplotlib进行封装,绘图效果更符合现代人的审美。
Seaborn属于Matplotlib的一个高级接口,使得作图更加容易。在多数情况下使用Seaborn能做出很具吸引力的图,而使用Matplotlib可以制作具有更多特色的图。应该把Seaborn视为Matplotlib的补充,而不是替代物。
使用Seaborn时,使用的导入惯例为:
import seaborn as sns
风格设置用以设置绘图的背景色、风格、字型、字体等。
Seaborn通过set函数实现风格设置。
seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)

 
风格设置用以设置绘图的背景色、风格、字型、字体等。
Seaborn通过set函数实现风格设置。
seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)

 
1、对分组数据进行统计绘图,先用统计函数再绘图
2、不同子区域绘制不同图形

例7-1用matplotlib绘制曲线

In [3]:

 
def sinplot(flip = 2):
    x = np.linspace(0,20,50)#50个点
    for i in range(1,5):#1-4张图
        plt.plot(x,np.cos(x + i * 0.8) * (9 - 2 * i) * flip)
sinplot()

例7-2 Seaborn设置风格

In [4]:

 
sns.set(style = 'darkgrid',font_scale = 2)
#darkgrid是黑色网格
sinplot()

 
如果需要转换为seaborn默认的绘图设置,只需调用sns.set( )方法即可。

例7-3 Seaborn默认风格

In [5]:

 
sns.set()
sinplot()

 
利用set_style( )是用来设置主题的。
Seaborn有五个预设好的主题: darkgrid, whitegrid,dark,white,和 ticks,默认为darkgrid。
Seaborn将matplotlib的参数划分为两个独立的组合。第一组是设置绘图的外观风格的,第二组主要将绘图的各种元素按比例缩放的,以至可以嵌入到不同的背景环境中。控制这些参数的接口主要有两对方法:
控制风格:axes_style(), set_style()
缩放绘图:plotting_context(), set_context()
每对方法中的第一个方法(axes_style(), plotting_context())会返回一组字典参数【局部设置】而第二个方法(set_style(), set_context())会设置matplotlib的默认参数。【全局设置】
利用set_style( )是用来设置主题的。Seaborn有五个预设的主题: darkgrid, whitegrid,dark,white,和 ticks,默认为darkgrid。

例7-4 主题设置

In [6]:

 
sns.set_style('whitegrid')
sinplot()

 
在seaborn中,可以利用despine()方法移除绘图中顶部和右侧的轴线。

In [7]:

 
sinplot()
sns.despine()#移除顶部和右侧的轴线

 
despine()方法中可以利用offset参数讲轴线进行偏置,另外,当刻度没有完全覆盖整个坐标轴的的范围时,利用trim参数限制已有坐标轴的范围。

In [8]:

 
sinplot()
sns.despine(offset = 20)#以offset里面的数字为单位

例7-7 移除轴线

In [9]:

 
sinplot()
sns.despine(left = True)#控制哪个脊柱将被移除

例7-8 移除轴线

In [10]:

 
sinplot()
sns.set(style = 'dark',palette = 'muted',color_codes = True)
#palette是调色板  muted是温和的  color_codes颜色的模式
sns.despine(left = True,bottom = True)

 
补充:调色板
调色板类型:
1、定性调色板:一组在视觉上有差异的颜色,用于区分不具有内在顺序的离散数据;
2、顺序调色板:一组视觉温度递增或递减的颜色,一般是单一色相,也可以是多种色相,用于当数据集的范围从相对低值(不感兴趣)到相对高值(很感兴趣)时;
3、发散调色板:一组颜色的中间位置颜色的视觉温度最亮或最暗,然后分别向两端递增或递减,用于当数据集的低值和高值都很重要,且数据集中有明确定义的中点时。
1.1、使用循环颜色系统,当您要区分任意数量的类别而不强调任何类别时,最简单的方法是在循环颜色空间中绘制间距相等的颜色(在此颜色空间中,色调会发生变化,同时保持亮度和饱和度不变)。这是大多数seaborn函数在处理当需要区分的数据集超过颜色循环中的6种颜色时时所使用的默认方法。
最为常用的方法是使用hls颜色空间——一种简单的RGB值变体。
sns.palplot(sns.color_palette("hls", 8))
hls_palette()函数允许您控制颜色的亮度(lightness)和饱和度(saturation)。
sns.palplot(sns.hls_palette(8, l=.3, s=.8))
seaborn提供了一个husl系统(后来更名为HSLuv)的接口,这也使选择间隔均匀的色调变得容易,同时使亮度和饱和度都更加均匀。
sns.palplot(sns.color_palette("husl", 8))
类似地,husl_palette()函数也为这个系统提供了一个更灵活的接口。
2.1、与matplotlib类似,您可以通过添加加后缀_r来倒置顺序调色板的顺序。
sns.palplot(sns.color_palette("BuGn_r"))
seaborn同样添加了一个小窍门来帮助您创建“深色”调色板,它没有一个很宽的动态范围。在当您需要按顺序映射直线或点时这可能会很有用,因为颜色较亮的线条会比较难以区分。_d
sns.palplot(sns.color_palette("GnBu_d"))
2.2、顺序 “cubehelix” 调色板 
发散调色板
seaborn.set_palette(palette, n_colors=None, desat=None, color_codes=False)
通过searborn调色板设置matplotlib色彩循环
参数:palette:seaborn color paltte | matplotlib colormap | hls | husl
调色板参数。 应该可以被 color_palette() 函数处理。
n_colors:int 【色彩循环中的颜色数量。默认数量与palette模式有关】 desat:float  【每种颜色去饱和的比例。】
2.3、seaborn.color_palette
seaborn.color_palette(palette=None, n_colors=None, desat=None)返回一个颜色列表来定义一个调色板。
有 deep, muted, bright, pastel, dark, colorblind 六种颜色模式
调用此函数并设置 palette=None 会返回当前 matplotlib 色彩循环。
m=sns.color_palette(palette='bright',n_colors=4 )
matplotlib 调色板的顺序可以通过在调色板名称后添加 “_r” 来倒置,同样,添加 “_d” 可以将调色板设置为深色模式。(这些选项为互斥属性,返回的颜色列表同样可以被取反)
例子:不带参数的调用将返回当前默认颜色循环中的所有颜色:
>>> import seaborn as sns; sns.set()
>>> sns.palplot(sns.color_palette())
显示另一个 “seaborn 调色板”,具有与默认 matplotlib 颜色循环相同的基本色调顺序,但颜色更吸引人。默认情况下,使用调色板名称进行调用将返回6种颜色:
>>> sns.palplot(sns.color_palette("muted"))
使用一个内置 matplotlib clolormap 的离散值:
>>> sns.palplot(sns.color_palette("RdBu", n_colors=7))
创建自定义 cubehelix 调色板:
sns.palplot(sns.color_palette("ch:2.5,-.2,dark=.3"))
使用一个明确的 matplotlib 调色板并降低一些饱和度:
sns.palplot(sns.color_palette("Set1", n_colors=8, desat=.5))
创建 “dark”(深色)matplotlib 顺序调色板变体。(当对应于有序变量的多条线或点进行着色时,如果您不希望最轻的线不可见,则可以使用此选项):
sns.palplot(sns.color_palette("Blues_d"))
2.4、seaborn.husl_palette
seaborn.husl_palette(n_colors=6, h=0.01, s=0.9, l=0.65)在 HUSL 色调空间中获得一组均匀间隔的颜色。h, s, 和 l 值应该在 0 和 1 之间。
参数:n_colors:int【调色板中的颜色数】h:float【第一个色调】 s:float【饱和度】l:float【亮度】返回值:palette:seaborn 调色板
在 HSL 系统中使用等间距圆形色调创建一个调色板。
使用默认参数创建一个有 10 种颜色的调色板:
>>> import seaborn as sns; sns.set()
>>> sns.palplot(sns.husl_palette(10))
创建一个以不同色调值开头的 10 种颜色的调色板:
>>> sns.palplot(sns.husl_palette(10, h=.5))
rs:int
        调色板中的颜色数。
 
    start:float, 0 <= start <= 3
            第一个色调。
 
    rot:float   围绕调色板范围内的色相控制盘旋转。
    gamma:float 0 <= gamma      Gamma 系数用以强调较深 (Gamma < 1) 或较浅 (Gamma > 1) 的颜色。
    hue:float, 0 <= hue <= 1    颜色的饱和度。
    dark:float 0 <= dark <= 1   调色板中最暗颜色的强度。
    light:float 0 <= light <= 1 调色板中最浅颜色的强度。
    reverse:bool    如果为 True 值,则调色板将从暗到亮。
    as_cmap:bool    如果为 True 值,则返回 matplotlib colormap 而不是颜色列表。
 
返回值:palette or cmap:seaborn 调色板或者 matplotlib colormap
用 cubehelix 系统制作顺序调色板。
生成亮度呈线性减小(或增大)的 colormap。
除了使用这个函数,还可以在 seaborn 中使用字符串速记生成 cubehelix 调色板。
2.5、使用 color_palette() 函数接口:
>>> sns.palplot(sns.color_palette("ch:2,r=.2,l=.6"))
seaborn.dark_palette
seaborn.dark_palette(color, n_colors=6, 
reverse=False, as_cmap=False, input='rgb')
参数:color:高值的基色  十六进制、RGB 元组或者颜色名字。
    n_colors:int, 可选    调色板中的颜色数。
    reverse:bool, 可选    如果为 True 值,则反转混合的方向。
    as_cmap:bool, optional      如果为 True 值,则返回 matplotlib colormap 而不是列表。
    input:{‘rgb’, ‘hls’, ‘husl’, xkcd’} 用于解释输入颜色的颜色空间。前三个选项适用于元组输入,后者适用于字符串输入。
返回值:palette or cmap:seaborn color palette or matplotlib colormap
制作一个混合深色和 color 模式的顺序调色板。
这种调色板适用于数据集的范围从相对低值(不感兴趣)到相对高值(很感兴趣)时。
可以通过多种方式指定 color 参数,包括用于在 matplotlib 中定义颜色的所有选项,以及由 seborn 处理的其他几个颜色空间。也可以使用 XKCD color survey 中的颜色名字数据库。
2.6、seaborn.light_palette
seaborn.light_palette(color, n_colors=6, 
reverse=False, as_cmap=False, input='rgb')
参数:color:高值的基色  十六进制、RGB 元组或者颜色名字。
    n_colors:int, 可选    调色板中的颜色数。
    reverse:bool, 可选    如果为 True 值,则反转混合的方向。
    as_cmap:bool, optional      如果为 True 值,则返回 matplotlib colormap 而不是列表。
    input:{‘rgb’, ‘hls’, ‘husl’, xkcd’} 用于解释输入颜色的颜色空间。前三个选项适用于元组输入,后者适用于字符串输入。
返回值:palette or cmap:seaborn color palette or matplotlib colormap
2.7、制作一个混合浅色和 color 模式的顺序调色板。
这种调色板适用于数据集的范围从相对低值(不感兴趣)到相对高值(很感兴趣)时。
可以通过多种方式指定 color 参数,包括用于在 matplotlib 中定义颜色的所有选项,以及由 seborn 处理的其他几个颜色空间。也可以使用 XKCD color survey 中的颜色名字数据库。
从一个 HTML 颜色生成一个调色板:
>>> import seaborn as sns; sns.set()
>>> sns.palplot(sns.light_palette("purple"))
生成亮度降低的调色板:
>>> sns.palplot(sns.light_palette("seagreen", reverse=True))
从 HUSL 空间种子生成选项板:
>>> sns.palplot(sns.light_palette((260, 75, 60), input="husl"))
生成一个 colormap 对象:
>>> from numpy import arange
>>> x = arange(25).reshape(5, 5)
>>> cmap = sns.light_palette("#2ecc71", as_cmap=True)
>>> ax = sns.heatmap(x, cmap=cmap)
seaborn.diverging_palette
seaborn.diverging_palette(h_neg, h_pos, s=75, l=50, sep=10, n=6, 
center='light', as_cmap=False)
参数:h_neg, h_pos:float in [0, 359]       图的正负范围的锚定色调
    s:[0, 100] 范围内的浮点数,可选       图的两个范围的锚定饱和度
    l:[0, 100] 范围内的浮点数,可选       图的两个范围的锚定亮度
    n:int,可选        调色板中的颜色数(如果为not,返回一个colormap)
    center:{“light”, “dark”}, 可选        调色板中心为亮或暗
    as_cmap:bool, 可选        如果为 true,返回一个 matplotlib colormap 而不是一个颜色列表。
返回值:palette or cmap:seaborn color palette or matplotlib colormap
    类似列表的颜色对象的 RGB 元组,或者可以将连续值映射到颜色的 colormap 对象,具体取决于 as_cmap 参数的值。
在两个 HUSL 颜色直接建立一个发散调色板。
另外
创建具有暗值的连续调色板。创建具有亮值的连续调色板。
知乎补充:
1、生成调色板的函数
可生成三种调色板的函数
color_palette():生成调色盘,接受所有的seaborn调色板或者matplotlib Colormap或者Color Brewer库的配色方案,2、返回RGB元组的列表;
set_palette():接受与color_palette()相同参数,设置所有图像的默认配色方案;
xkcd_rgb():使用xkcd颜色名字设置单一颜色;
xkcd_palette():使用xkcd颜色名字生成调色板,适用于各种调色板;
choose_colorbrewer_palette():通过交互式组件辅助进行Color Brewer库的配色方案选择,适用于各种调色板,只能3、在Jupyter Notebook中使用;
3.1、用于生成定性调色板的函数
hls_palette():使用hls颜色空间生成间距相等的颜色(色调变化,明度和饱和度不变),适用于定性调色板;
husl_palette():使用HSLuv颜色空间生成间距相等的颜色,比上述hls更符合人眼视觉感受,适用于定性调色板;
3.2、用于生成顺序调色板的函数
cubehelix_palette():使用cubehelix调色板系统生成配色方案,适合黑白打印,且对色盲友好,适用于顺序调色板;
choose_cubehelix_palette():通过交互式组件辅助进行cubehelix调色板的配色方案选择,只能在Jupyter Notebook中使用;
light_palette()和dark_palette():指定一个颜色,会由明向暗或由暗向明生成一组颜色,适用于顺序调色板;
3.3、用于生成发散调色板的函数
diverging_palette():用来创建发散调色板;
choose_diverging_palette():通过交互式组件辅助进行发散调色板的配色方案选择,使用HSLuv颜色空间,只能在Jupyter Notebook中使用;
4、生成调色板的方式
seaborn中生成调色板的方式大致有三种:
4.1、直接指定一组颜色代码或名字,如color_palette()、xkcd_palette();
4.2、从现成的配色方案中选取,如color_palette()中直接使用seaborn内置配色方案,或从Color Brewer网站上挑选;
4.3、利用函数生成配色方案,如hls_palette()、husl_palette()、cubehelix_palette()、light_palette()、dark_palette()、diverging_palette()。
当您想要区分不具有内在顺序的离散数据块时,定性(分类)调色板是最佳方案。导入seaborn的同时,会引入默认的颜色循环,由6种颜色构成。并将调用标准matplotlib颜色循环,看起来也更加赏心悦目。默认主题有六种变体,分别为deep, muted,pastel, bright, dark, and colorblind。
Color Brewer库中的配色方案
Color Brewer库为三种类型调色板都提供了不少美观的配色方案,并且对色盲友好。
Color Brewer库地址:http://colorbrewer2.org
登陆网站后,通过选择调色板类型,颜色数量,配色方案,会得到配色方案的名称。

 
除了选用预设的风格外,可以利用with 语句使用axes_style()方法设置临时绘图参数。

例7-9 设置临时绘图参数

In [8]:

 
with sns.axes_style("darkgrid"):#临时设置
    plt.subplot(2,1,1)
    sinplot()
plt.subplot(2,1,2)
sinplot(-1)#前面定义的参数为2,此处做一修改

 
seaborn中通过set_context()设置缩放参数,预设的参数有paper, notebook, talk, poster。默认为notebook。

例7-10 使用字典传递参数

In [12]:

 
sns.set_style('darkgrid',{"axes.facecolor":'.7'})
#axes.facecolor字典设置背景颜色,值越小颜色越深
sinplot()

 
seaborn中通过set_context()设置缩放参数,预设的参数有paper, notebook, talk, poster。默认为notebook。

例7-11 7-12设置绘图元素比例paper

In [9]:

 
sns.set_context("talk")#talk比例放大 poster比例最大
sinplot()

例7-13 设置绘图元素比例notebook

In [14]:

 
sns.set_context("notebook",font_scale = 1.8,rc = {"lines.linewidth":2})
#font_scale = 1.8扩大到原来的1.8倍 rc = {"lines.linewidth":2}设置线宽
sinplot()

 
直方图和密度曲线图:
Seaborn中利用distplot( )和 kdeplot( )绘制直方图和密度曲线图,distplot( )为hist加强版,默认情况下绘制一个直方图,并嵌套一个对应的密度图。
例:绘制iris数据集中Petal.Width的分布图。
使用distplot方法绘制的直方图与matplotlib是类似的。在distplot的参数中,可以选择不绘制密度图。其中的rug参数绘制毛毯图,可以为每个观测值绘制小细线(边际毛毯),也可以单独用rugplot进行绘制。

例7-14 绘制iris数据集中Petal.Width的分布

In [20]:

 
df_iris = pd.read_csv('iris.csv')#导入数据
display(df_iris)
sns.set(color_codes = True)#颜色模式
sns.distplot(df_iris['Petal.Width'])#对Petal.Width这一列进行绘制
plt.show()#直方图与密度图的集合
Unnamed: 0Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
015.13.51.40.2setosa
124.93.01.40.2setosa
234.73.21.30.2setosa
344.63.11.50.2setosa
455.03.61.40.2setosa
.....................
1451466.73.05.22.3virginica
1461476.32.55.01.9virginica
1471486.53.05.22.0virginica
1481496.23.45.42.3virginica
1491505.93.05.11.8virginica

150 rows × 6 columns

 
使用distplot方法绘制的直方图与matplotlib是类似的。在distplot的参数中,可以选择不绘制密度图。其中的rug参数绘制毛毯图,可以为每个观测值绘制小细线(边际毛毯),也可以单独用rugplot进行绘制。

例7-15 使用distplot方法绘制直方图

In [16]:

 
sns.distplot(df_iris['Petal.Width'],bins =30,kde = False,rug = True)
#bins =30直方图的个数为30 kde = False不加密度图,去掉趋势线  rug为观测值的图的下方加上小细线

Out[16]:

<AxesSubplot:xlabel='Petal.Width'>

例7-16 直接绘制密度图

 
如果设置hist为False,则可以直接绘制密度图而没有直方图。

In [17]:

 
sns.distplot(df_iris['Petal.Width'],hist = False,rug = True)
#hist = False不加直方图,只有密度图

Out[17]:

<AxesSubplot:xlabel='Petal.Width', ylabel='Density'>

 
利用distplot函数可以同时绘制直方图、密度图和毛毯图,同时,这些分布图都有对应的专门函数。其中,kdeplot函数绘制密度图,rugplot用于绘制毛毯图。

例7-17 使用kdeplot绘制密度图

In [18]:

 
fig,axes = plt.subplots(1,3)
sns.distplot(df_iris['Petal.Length'],ax = axes[0],kde = True,rug = True)
#ax = axes[0]指第一个图
sns.kdeplot(df_iris['Petal.Length'],ax = axes[1],shade = True)
#shade = True指的是加阴影
sns.rugplot(df_iris['Petal.Length'],ax = axes[2])
plt.show()

例7-18 displot绘图

In [19]:

 
sns.set(palette = 'muted',color_codes = 'True')
rs = np.random.RandomState(10)
#生成随机数RandomState类似于random.state加上随机种子
d = rs.normal(size = 100)#利用随机种子设置100 个随机数
f,axes = plt.subplots(2,2,figsize = (7,7),sharex = True)
#figsize = (7,7)画布尺寸7*7 sharex = True共享x轴【在第一行的两个图当中x轴下方的数字隐藏】中间没有
sns.distplot(d,ax = axes[0,0],kde = False,color = 'b')
#只有直方图  颜色b映射蓝色
sns.distplot(d,ax = axes[0,1],hist = False,rug = True,color = 'r')
#只保留密度图 rug加小毛毯
sns.distplot(d,ax = axes[1,0],hist = False,color = 'g',kde_kws = {"shade":True})
#kde_kws = {"shade":True}此处不是上面的kdeplot方法下,所以要用这种方法来加阴影
sns.distplot(d,ax = axes[1,1],color = 'm')

Out[19]:

<AxesSubplot:ylabel='Density'>

例7-19 在iris数据集中,显示Patal.Width在Species上值的分布

 
在Seaborn中,利用stripplot绘制各变量在每个类别的值。

In [25]:

 
sns.set(style = 'white',color_codes = True)
sns.stripplot(x=  df_iris['Species'],y = df_iris['Petal.Width'],data = df_iris)
#x、y轴对应
sns.despine()#去掉坐标轴

In [26]:

 
sns.stripplot(x=  df_iris['Species'],y = df_iris['Petal.Width'],data = df_iris,jitter = True)
#加入抖动每次的效果不一样
sns.despine()
#由于散点图中数据众多,很多点会被覆盖,这时可以加入抖动(jitter=True)。

In [21]:

 
sns.swarmplot(x=  df_iris['Species'],y = df_iris['Petal.Width'],data = df_iris)
#看清每个数据点,散开数据
#sns.despine()
#如果需要看清每个数据点,可以使用swarmplot函数

Out[21]:

<AxesSubplot:xlabel='Species', ylabel='Petal.Width'>

 
有时候,散点图表达的值的分布信息有限,因此需要一些其它的绘图。箱线图可以观察四分位数、中位数和极值。Seaborn中利用boxplot( )绘制箱线图。

例7-22 使用boxplot绘制箱线图

In [28]:

 
sns.boxplot(x = df_iris['Species'],y = df_iris['Petal.Width'])
plt.show()

 
在seaborn中利用 pairplot()实现数据特征的两两对比。默认是所有特征,可以通过vars参数指定部分特征。
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) 
pairplot主要展现的是变量两两之间的关系(线性或非线性,有无较为明显的相关关系)

例7-23 使用pairplot绘图

In [22]:

 
sns.set(style = 'ticks')#加白色背景
#pairplot进行两两对比
g = sns.pairplot(df_iris,vars = ['Sepal.Length','Petal.Length','Sepal.Width','Petal.Width'])
#对比Sepal.Length','Petal.Length这两个

 
小提琴图其实是箱线图与核密度图的结合,箱线图展示了分位数的位置,小提琴图则展示了任意位置的密度,通过小提琴图可以知道哪些位置的密度较高。在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计(在概率论中用来估计未知的密度函数,属于非参数检验方法之一)。

例7-24 小提琴图绘制

In [30]:

 
sns.set_style('whitegrid')
ax = sns.violinplot(x = df_iris['Petal.Length'])

In [31]:

 
sns.barplot(x = df_iris['Species'],y = df_iris['Petal.Width'],data = df_iris)
#x表示类型
plt.show()
#在Seaborn中使用barplot函数绘制柱状图,默认情况下,绘制的y轴是平均值。

 
在柱状图中,经常会绘制类别的计数柱状图,在matplotlib中需要对DataFrame进行计算,而在Seaborn中则使用countplot函数即可。

例7-26 使用countplot函数绘制半数柱状图

In [23]:

 
sns.set(style = 'darkgrid',font_scale =1.2)#比例为1.2
titanic = pd.read_csv('titanic.csv')
display(titanic)
plt.subplot(1,2,1)
sns.countplot(x = 'class',hue = 'who',data = titanic)
#countplot绘制类别计数柱状图 x是类别,y安装年龄分类计数
plt.subplot(1,2,2)
sns.countplot(x = 'who',data = titanic,facecolor = (0,0,0,0),
              linewidth = 5,edgecolor = sns.color_palette("dark",3))
#facecolor = (0,0,0,0)颜色 linwidth线宽 edgecolor表示颜色预设值
plt.show()
survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue
................................................
88602male27.00013.0000SSecondmanTrueNaNSouthamptonnoTrue
88711female19.00030.0000SFirstwomanFalseBSouthamptonyesTrue
88803femaleNaN1223.4500SThirdwomanFalseNaNSouthamptonnoFalse
88911male26.00030.0000CFirstmanTrueCCherbourgyesTrue
89003male32.0007.7500QThirdmanTrueNaNQueenstownnoTrue

891 rows × 15 columns

 
在matplotlib中,为了绘制两个变量的分布关系,常使用散点图的方法。在Seaborn中,使用jointplot函数绘制一个多面板图,不仅可以显示两个变量的关系,还可以显示每个单变量的分布情况。

例7-27 使用jointplot函数绘制多面板图

In [35]:

 
sns.jointplot(x = 'Petal.Length',y = 'Petal.Width',data = df_iris)
#绘图多变量分布关系
plt.show()

 
在jointplot函数中,改变kind参数为kde,但变量的分布就用密度图来代替,而散点图则会被等高线图代替。

例7-28 使用jointplot方法绘制等高线图

In [36]:

 
sns.set(style = 'ticks')
#sns.jointplot(x = 'Petal.Length',y = 'Petal.Width',data = df_iris,kind = 'kde',shade = 'True')#这种只是加内部的阴影
sns.jointplot(x = 'Petal.Length',y = 'Petal.Width',
              data = df_iris,kind = 'kde',joint_kws = dict(shade = True),
             marginal_kws = dict(shade = True))
#joint_kws = dict(shade = True用字典加入散点图的阴影  marginal_kws = dict(shade = True)加的是边上的kde阴影

Out[36]:

<seaborn.axisgrid.JointGrid at 0x17acf0c3940>

例7-29 使用regplot函数绘制回归图

In [37]:

 
sns.regplot(x = 'Petal.Length',y = 'Petal.Width',data = df_iris)
#regplot绘制回归图可以揭示两个变量间的线性关系

Out[37]:

<AxesSubplot:xlabel='Petal.Length', ylabel='Petal.Width'>

 
replot关注统计量之间的关系,用kind可以绘制出曲线图和散点图,必选参数为以下几个:
1)x,y为数据中的变量名称,一般为数值型数据
2)data是DataFrame类型的数据表,kind指定绘图类型,取值scatter相当于scatterplot(),用来绘制散点图,取值line相当于lineplot(),用来绘制曲线图,kind默认取值为scatter。

例7-30 绘制tips数据集中小费总额和小费的关系图

In [38]:

 
tips = pd.read_excel('tips.xls')
sns.set(style = 'ticks',font_scale =1.5)
sns.relplot(x = "total_bill",y = "tip",data = tips)
#sns.relplot(x = "total_bill",y = "tip",data = tips,kind = 'line')
sns.relplot(x = "total_bill",y = "tip",data = tips,hue = "day",col = "time")
#hue按照天分类  col分类列 按照时间分类

Out[38]:

<seaborn.axisgrid.FacetGrid at 0x17acf9c7850>

 
热力图通过颜色变换程度直观反映出热点分布、区域聚集等数据信息。实现过程是通过简单的数学变化,将离散的点信息映射为图像
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', yticklabels='auto', mask=None, ax=None, **kwargs)
heatmap中的参数annot为True时,为每个单元格写入数据值。如果数组具有与数据相同的形状,则使用它来注释热力图而不是原始数据。参数fmt是指添加注释时要使用的字符串格式代码
heatmap函数中的参数linewidths是指划分每个单元格的行的宽度
heatmap函数中的参数cmap是指色彩颜色的选择,可选的颜色还有很多,比如:Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r, YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r...其中末尾加r是颜色取反
heatmap函数中的参数xticklabels,yticklabels如果是True则绘制数据框的列名称;如果是False则不绘制列名称,如果是列表则将这些替代标签绘制为xticklabels;如果是整数则使用列名称也只是绘制n个标签;如果是自动的,请尝试密集绘制不重叠的标签。
heatmap函数中的参数cbar为TRUE即绘制颜色条,为False就不绘制颜色条。
subplots函数中的参数gridspec_kw是将字典的关键字传递给GridSpec构造函数创建子图放在网格里。heatmap函数中的参数ax指绘制图的轴,否则使用当前活动的轴,cbar_ax用于绘制颜色条的轴,否则从主轴获取;cbar_kwsfig.colorbar的关键字参数.
heatmap函数中的参数mask如果通过,则数据不会显示在mask为True的单元格中,具有缺失值的单元格将自动被屏蔽。参数square为Ture,则将Axes方面设置为相等,并使其每个单元格为方形。参数vmax用于锚定色彩图的值,否则会从数据和其他关键字参数推断出来
https://www.jianshu.com/p/e195a09a8ca9

例7-31 绘制flights数据集中年份、月份和乘客数据的热力图

In [39]:

 
flights = pd.read_csv("flights.csv")
flights = flights.pivot("month","year","passengers")
#pivot转换数据格式,做一个总结
display(flights)
sns.set(font_scale = 1.0)#恢复比例
sns.heatmap(flights,alpha = 0.7)#直接做热力图
year194919501951195219531954195519561957195819591960
month
April129135163181235227269313348348396461
August148170199242272293347405467505559606
December118140166194201229278306336337405432
February118126150180196188233277301318342391
January112115145171196204242284315340360417
July148170199230264302364413465491548622
June135149178218243264315374422435472535
March132141178193236235267317356362406419
May121125172183229234270318355363420472
November104114146172180203237271305310362390
October119133162191211229274306347359407461
September136158184209237259312355404404463508

Out[39]:

<AxesSubplot:xlabel='year', ylabel='month'>

本章实训

实训1 学生数据可视化分析

In [53]:

 
#导入模块
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']
plt.rcParams['font.serif'] = ['simhei']
# from sklearn.model_selection import train_test_split
# from sklearn.linear_model import LogisticRegression 
# from sklearn.preprocessing import LabelEncoder
# from sklearn.metrics import accuracy_score
import warnings
warnings.filterwarnings('ignore')

In [54]:

 
#获取数据
from matplotlib.font_manager import FontProperties
myfont=FontProperties(fname=r'SimHei.ttf',size=12)#添加字库
sns.set(font=myfont.get_name())#显示中文效果,不然不出现效果
df = pd.read_csv("StudentPerformance.csv")
df.head(4)

Out[54]:

genderNationalITyPlaceofBirthStageIDGradeIDSectionIDTopicSemesterRelationraisedhandsVisITedResourcesAnnouncementsViewDiscussionParentAnsweringSurveyParentschoolSatisfactionStudentAbsenceDaysClass
0MKWKuwaITlowerlevelG-04AITFFather1516220YesGoodUnder-7M
1MKWKuwaITlowerlevelG-04AITFFather2020325YesGoodUnder-7M
2MKWKuwaITlowerlevelG-04AITFFather107030NoBadAbove-7L
3MKWKuwaITlowerlevelG-04AITFFather3025535NoBadAbove-7L

数据可视化分析

In [58]:

 
#修改表列名
df.rename(columns = {'gender':'性别','NationalITy':'国籍','PlaceofBirth':'出生地',
                     'StageID':'学段','GradeID':'年级','SectionID':'班级','Topic':
                     '科目','Semester':'学期','Relation':'监管人','raisedhands':
                     '举手次数','VisITedResources':'浏览课件次数','AnnouncementsView':
                     '浏览公告次数','Discussion':'讨论次数','ParentAnsweringSurvey':
                     '父母问卷','ParentschoolSatisfaction':'家长满意度',
                     'StudentAbsenceDays':'缺勤次数','Class':'成绩'},inplace = True)#用了inplace修改之后,后面就无法修改了
df

Out[58]:

性别国籍出生地学段年级班级科目学期监管人举手次数浏览课件次数浏览公告次数讨论次数父母问卷家长满意度缺勤次数成绩
0MKWKuwaITlowerlevelG-04AITFFather1516220YesGoodUnder-7M
1MKWKuwaITlowerlevelG-04AITFFather2020325YesGoodUnder-7M
2MKWKuwaITlowerlevelG-04AITFFather107030NoBadAbove-7L
3MKWKuwaITlowerlevelG-04AITFFather3025535NoBadAbove-7L
4MKWKuwaITlowerlevelG-04AITFFather40501250NoBadAbove-7M
......................................................
475FJordanJordanMiddleSchoolG-08AChemistrySFather5458NoBadAbove-7L
476FJordanJordanMiddleSchoolG-08AGeologyFFather50771428NoBadUnder-7M
477FJordanJordanMiddleSchoolG-08AGeologySFather55742529NoBadUnder-7M
478FJordanJordanMiddleSchoolG-08AHistoryFFather30171457NoBadAbove-7L
479FJordanJordanMiddleSchoolG-08AHistorySFather35142362NoBadAbove-7L

480 rows × 17 columns

In [60]:

 
#显示学期和字段的取值
print('学段取值:',df['学段'].unique())
print('学期取值:',df['学期'].unique())
学段取值: ['lowerlevel' 'MiddleSchool' 'HighSchool']
学期取值: ['F' 'S']

In [61]:

 
#修改数据 在原表的基础上修改
df.replace({'lowerlevel':'小学','MiddleSchool':'中学','HighSchool':'高中'},inplace = True)
df['性别'].replace({'M':'男','F':'女'},inplace = True)#限定在性别这一列进行修改
df['学期'].replace({'S':'春季','F':'秋季'},inplace = True)
df

Out[61]:

性别国籍出生地学段年级班级科目学期监管人举手次数浏览课件次数浏览公告次数讨论次数父母问卷家长满意度缺勤次数成绩
0KWKuwaIT小学G-04AIT秋季Father1516220YesGoodUnder-7M
1KWKuwaIT小学G-04AIT秋季Father2020325YesGoodUnder-7M
2KWKuwaIT小学G-04AIT秋季Father107030NoBadAbove-7L
3KWKuwaIT小学G-04AIT秋季Father3025535NoBadAbove-7L
4KWKuwaIT小学G-04AIT秋季Father40501250NoBadAbove-7M
......................................................
475JordanJordan中学G-08AChemistry春季Father5458NoBadAbove-7L
476JordanJordan中学G-08AGeology秋季Father50771428NoBadUnder-7M
477JordanJordan中学G-08AGeology春季Father55742529NoBadUnder-7M
478JordanJordan中学G-08AHistory秋季Father30171457NoBadAbove-7L
479JordanJordan中学G-08AHistory春季Father35142362NoBadAbove-7L

480 rows × 17 columns

In [62]:

 
#查看空缺数据情况
df.isnull().sum()

Out[62]:

性别        0
国籍        0
出生地       0
学段        0
年级        0
班级        0
科目        0
学期        0
监管人       0
举手次数      0
浏览课件次数    0
浏览公告次数    0
讨论次数      0
父母问卷      0
家长满意度     0
缺勤次数      0
成绩        0
dtype: int64

In [63]:

 
#按成绩绘制计数柱状图
sns.set(font_scale = 1.2)
sns.countplot(x = '成绩',order = ['L','M','H'],data = df,linewidth = 2,
              edgecolor = sns.color_palette("dark",4))
#数指求平均值,类别按照类别计数  order对x直接进行分类  color_palette颜色【每个颜色10个类别】

Out[63]:

<AxesSubplot:xlabel='成绩', ylabel='count'>

In [64]:

 
#按性别绘制计数柱状图
sns.countplot(x = '性别',order = ['女','男'],data = df)

Out[64]:

<AxesSubplot:xlabel='性别', ylabel='count'>

In [65]:

 
#按科目绘制计数柱状图
sns.set_style('whitegrid')
sns.set(rc = {'figure.figsize':(16,8)})
sns.countplot(x = '科目',data = df)

Out[65]:

<AxesSubplot:xlabel='科目', ylabel='count'>

In [66]:

 
#按科目绘制不同成绩的计数柱状图
sns.set(rc = {'figure.figsize':(20,10)},font = myfont.get_name(),font_scale=1.5)
#font = myfont.get_name()必须加入这个,否则汉字出不来
sns.countplot(x = '科目',hue = '成绩',hue_order = ['L','M','H'],data = df)
#hue_order进行分类

Out[66]:

<AxesSubplot:xlabel='科目', ylabel='count'>

In [67]:

 
#按性别和成绩绘制计数柱状图
sns.countplot(x = '性别',hue = '成绩',data = df,order = ['女','男'],hue_order = ['L','M','H'])

Out[67]:

<AxesSubplot:xlabel='性别', ylabel='count'>

In [68]:

 
#按班级查看成绩分布比例
sns.countplot(x = '班级',hue = '成绩',data = df,hue_order = ['L','M','H'])

Out[68]:

<AxesSubplot:xlabel='班级', ylabel='count'>

In [69]:

 
#分析4个表现和成绩的相关性
#在sns.barplot中,默认的计算方式为计算平均值
fig,axes = plt.subplots(2,2,figsize = (14,10))
sns.barplot(x = '成绩',y = '浏览课件次数',data = df,order = ['L','M','H'],ax = axes[0,0])
sns.barplot(x = '成绩',y = '浏览公告次数',data = df,order = ['L','M','H'],ax = axes[0,1])
sns.barplot(x = '成绩',y = '举手次数',data = df,order = ['L','M','H'],ax = axes[1,0])
sns.barplot(x = '成绩',y = '讨论次数',data = df,order = ['L','M','H'],ax = axes[1,1])

Out[69]:

<AxesSubplot:xlabel='成绩', ylabel='讨论次数'>

In [70]:

 
#分析不同成绩学生的讨论情况
sns.set(rc = {'figure.figsize':(8,6)},font = myfont.get_name())
sns.boxplot(x = '成绩',y = '讨论次数',data = df,order = ['L','M','H'])

Out[70]:

<AxesSubplot:xlabel='成绩', ylabel='讨论次数'>

In [71]:

 
#分析举手次数和参加讨论次数的相关性
sns.regplot(x = '举手次数',y = '讨论次数',data = df,order = 4)

Out[71]:

<AxesSubplot:xlabel='举手次数', ylabel='讨论次数'>

In [72]:

 
#分析浏览课件次数、举手次数、浏览公告次数、讨论次数之间的相关性
corr = df[['浏览课件次数','举手次数','浏览公告次数','讨论次数']].corr()
corr

Out[72]:

浏览课件次数举手次数浏览公告次数讨论次数
浏览课件次数1.0000000.6915720.5945000.243292
举手次数0.6915721.0000000.6439180.339386
浏览公告次数0.5945000.6439181.0000000.417290
讨论次数0.2432920.3393860.4172901.000000

In [73]:

 
#将相关矩阵可视化显示
sns.heatmap(corr,xticklabels = corr.columns,yticklabels = corr.columns)

Out[73]:

<AxesSubplot:>

实训2

In [24]:

 
#导入模块
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']
plt.rcParams['font.serif'] = ['simhei']
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline

In [75]:

 
#获取数据
titanic = pd.read_csv('titanic.csv')
titanic.head()

Out[75]:

survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue

数据可视化

In [76]:

 
#查看有无缺失值
titanic.isnull().sum()

Out[76]:

survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64

In [77]:

 
#用年龄的均值进行缺失值的填充
mean = titanic['age'].mean()
print(mean)
titanic['age'] = titanic['age'].fillna(mean)
titanic.isnull().sum()
29.69911764705882

Out[77]:

survived         0
pclass           0
sex              0
age              0
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64

In [79]:

 
#进行年龄分布的可视化
sns.distplot(titanic['age'])

Out[79]:

<AxesSubplot:xlabel='age', ylabel='Density'>

In [80]:

 
#显示登船地点(S,C,Q)的人数
titanic['embarked'].value_counts()

Out[80]:

S    644
C    168
Q     77
Name: embarked, dtype: int64

In [81]:

 
#对登船地点进行缺失值的填充(填充为S)
titanic['embarked'] = titanic['embarked'].fillna('s')
titanic['embarked'].isnull().sum()

Out[81]:

0

In [82]:

 
#对于deck字段,由于缺失值太多,将其删除
del titanic["deck"]
titanic.head()

Out[82]:

survivedpclasssexagesibspparchfareembarkedclasswhoadult_maleembark_townalivealone
003male22.0107.2500SThirdmanTrueSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueSouthamptonnoTrue

数据探索

In [83]:

 
#可视化乘客的性别分布
sns.countplot(x = 'sex',data = titanic)

Out[83]:

<AxesSubplot:xlabel='sex', ylabel='count'>

In [84]:

 
#基于性别,绘制乘客年龄公布箱线图
sns.boxplot(x = 'sex',y = 'age',data = titanic)

Out[84]:

<AxesSubplot:xlabel='sex', ylabel='age'>

In [85]:

 
#对船舱等级进行计数
sns.countplot(x = 'class',data = titanic,order = ['First','Second','Third'])

Out[85]:

<AxesSubplot:xlabel='class', ylabel='count'>

In [86]:

 
#结合船舱等级,绘制乘客年龄分布的小提琴图
sns.violinplot(y = 'age',x = 'class',data = titanic,order = ['First','Second','Third'])

Out[86]:

<AxesSubplot:xlabel='class', ylabel='age'>

In [89]:

 
#对年龄进行分级,分开小孩和老人的数据
def agelevel(age):
    if age <= 16:
        return 'child'
    elif age >= 60:
        return 'old'
 
    else:
        return 'middle'
titanic['age_level'] = titanic['age'].map(agelevel)
titanic.head()

Out[89]:

survivedpclasssexagesibspparchfareembarkedclasswhoadult_maleembark_townalivealoneage_level
003male22.0107.2500SThirdmanTrueSouthamptonnoFalsemiddle
111female38.01071.2833CFirstwomanFalseCherbourgyesFalsemiddle
213female26.0007.9250SThirdwomanFalseSouthamptonyesTruemiddle
311female35.01053.1000SFirstwomanFalseSouthamptonyesFalsemiddle
403male35.0008.0500SThirdmanTrueSouthamptonnoTruemiddle

In [90]:

 
#对分级后的年龄可视化
sns.countplot(x = 'age_level',data = titanic)

Out[90]:

<AxesSubplot:xlabel='age_level', ylabel='count'>

In [91]:

 
#分析乘客年龄与生还乘客之间的关系
sns.countplot(x = 'alive',hue = 'age_level',data = titanic)
plt.legend(loc = 'best',fontsize = '15')

Out[91]:

<matplotlib.legend.Legend at 0x17ad33e7490>

写在最后:

此处的数据是来源与我自己的数据,想要的宝子可以私信我要奥,也希望我写的博文能帮到你们。文章当中的图片由于一些原因无法展示,希望各位宝子可以见谅哈!各位宝子也可以自行验证

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐