目录

前言

相关案例与解析

写在最后:

前言

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.WidthSpecies015.13.51.40.2setosa124.93.01.40.2setosa234.73.21.30.2setosa344.63.11.50.2setosa455.03.61.40.2setosa.....................1451466.73.05.22.3virginica1461476.32.55.01.9virginica1471486.53.05.22.0virginica1481496.23.45.42.3virginica1491505.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]:

例7-16 直接绘制密度图

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

In [17]:

sns.distplot(df_iris['Petal.Width'],hist = False,rug = True)

#hist = False不加直方图,只有密度图

Out[17]:

利用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]:

例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]:

有时候,散点图表达的值的分布信息有限,因此需要一些其它的绘图。箱线图可以观察四分位数、中位数和极值。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_townalivealone003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue................................................88602male27.00013.0000SSecondmanTrueNaNSouthamptonnoTrue88711female19.00030.0000SFirstwomanFalseBSouthamptonyesTrue88803femaleNaN1223.4500SThirdwomanFalseNaNSouthamptonnoFalse88911male26.00030.0000CFirstmanTrueCCherbourgyesTrue89003male32.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]:

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

In [37]:

sns.regplot(x = 'Petal.Length',y = 'Petal.Width',data = df_iris)

#regplot绘制回归图可以揭示两个变量间的线性关系

Out[37]:

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.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)#直接做热力图

year194919501951195219531954195519561957195819591960monthApril129135163181235227269313348348396461August148170199242272293347405467505559606December118140166194201229278306336337405432February118126150180196188233277301318342391January112115145171196204242284315340360417July148170199230264302364413465491548622June135149178218243264315374422435472535March132141178193236235267317356362406419May121125172183229234270318355363420472November104114146172180203237271305310362390October119133162191211229274306347359407461September136158184209237259312355404404463508

Out[39]:

本章实训

实训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]:

genderNationalITyPlaceofBirthStageIDGradeIDSectionIDTopicSemesterRelationraisedhandsVisITedResourcesAnnouncementsViewDiscussionParentAnsweringSurveyParentschoolSatisfactionStudentAbsenceDaysClass0MKWKuwaITlowerlevelG-04AITFFather1516220YesGoodUnder-7M1MKWKuwaITlowerlevelG-04AITFFather2020325YesGoodUnder-7M2MKWKuwaITlowerlevelG-04AITFFather107030NoBadAbove-7L3MKWKuwaITlowerlevelG-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-7M1MKWKuwaITlowerlevelG-04AITFFather2020325YesGoodUnder-7M2MKWKuwaITlowerlevelG-04AITFFather107030NoBadAbove-7L3MKWKuwaITlowerlevelG-04AITFFather3025535NoBadAbove-7L4MKWKuwaITlowerlevelG-04AITFFather40501250NoBadAbove-7M......................................................475FJordanJordanMiddleSchoolG-08AChemistrySFather5458NoBadAbove-7L476FJordanJordanMiddleSchoolG-08AGeologyFFather50771428NoBadUnder-7M477FJordanJordanMiddleSchoolG-08AGeologySFather55742529NoBadUnder-7M478FJordanJordanMiddleSchoolG-08AHistoryFFather30171457NoBadAbove-7L479FJordanJordanMiddleSchoolG-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]:

性别国籍出生地学段年级班级科目学期监管人举手次数浏览课件次数浏览公告次数讨论次数父母问卷家长满意度缺勤次数成绩0男KWKuwaIT小学G-04AIT秋季Father1516220YesGoodUnder-7M1男KWKuwaIT小学G-04AIT秋季Father2020325YesGoodUnder-7M2男KWKuwaIT小学G-04AIT秋季Father107030NoBadAbove-7L3男KWKuwaIT小学G-04AIT秋季Father3025535NoBadAbove-7L4男KWKuwaIT小学G-04AIT秋季Father40501250NoBadAbove-7M......................................................475女JordanJordan中学G-08AChemistry春季Father5458NoBadAbove-7L476女JordanJordan中学G-08AGeology秋季Father50771428NoBadUnder-7M477女JordanJordan中学G-08AGeology春季Father55742529NoBadUnder-7M478女JordanJordan中学G-08AHistory秋季Father30171457NoBadAbove-7L479女JordanJordan中学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]:

In [64]:

#按性别绘制计数柱状图

sns.countplot(x = '性别',order = ['女','男'],data = df)

Out[64]:

In [65]:

#按科目绘制计数柱状图

sns.set_style('whitegrid')

sns.set(rc = {'figure.figsize':(16,8)})

sns.countplot(x = '科目',data = df)

Out[65]:

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]:

In [67]:

#按性别和成绩绘制计数柱状图

sns.countplot(x = '性别',hue = '成绩',data = df,order = ['女','男'],hue_order = ['L','M','H'])

Out[67]:

In [68]:

#按班级查看成绩分布比例

sns.countplot(x = '班级',hue = '成绩',data = df,hue_order = ['L','M','H'])

Out[68]:

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]:

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]:

In [71]:

#分析举手次数和参加讨论次数的相关性

sns.regplot(x = '举手次数',y = '讨论次数',data = df,order = 4)

Out[71]:

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]:

实训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_townalivealone003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse403male35.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]:

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_townalivealone003male22.0107.2500SThirdmanTrueSouthamptonnoFalse111female38.01071.2833CFirstwomanFalseCherbourgyesFalse213female26.0007.9250SThirdwomanFalseSouthamptonyesTrue311female35.01053.1000SFirstwomanFalseSouthamptonyesFalse403male35.0008.0500SThirdmanTrueSouthamptonnoTrue

数据探索

In [83]:

#可视化乘客的性别分布

sns.countplot(x = 'sex',data = titanic)

Out[83]:

In [84]:

#基于性别,绘制乘客年龄公布箱线图

sns.boxplot(x = 'sex',y = 'age',data = titanic)

Out[84]:

In [85]:

#对船舱等级进行计数

sns.countplot(x = 'class',data = titanic,order = ['First','Second','Third'])

Out[85]:

In [86]:

#结合船舱等级,绘制乘客年龄分布的小提琴图

sns.violinplot(y = 'age',x = 'class',data = titanic,order = ['First','Second','Third'])

Out[86]:

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_level003male22.0107.2500SThirdmanTrueSouthamptonnoFalsemiddle111female38.01071.2833CFirstwomanFalseCherbourgyesFalsemiddle213female26.0007.9250SThirdwomanFalseSouthamptonyesTruemiddle311female35.01053.1000SFirstwomanFalseSouthamptonyesFalsemiddle403male35.0008.0500SThirdmanTrueSouthamptonnoTruemiddle

In [90]:

#对分级后的年龄可视化

sns.countplot(x = 'age_level',data = titanic)

Out[90]:

In [91]:

#分析乘客年龄与生还乘客之间的关系

sns.countplot(x = 'alive',hue = 'age_level',data = titanic)

plt.legend(loc = 'best',fontsize = '15')

Out[91]:

写在最后:

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

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: