目录
前言
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: 0 | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | |
---|---|---|---|---|---|---|
0 | 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
3 | 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
4 | 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
... | ... | ... | ... | ... | ... | ... |
145 | 146 | 6.7 | 3.0 | 5.2 | 2.3 | virginica |
146 | 147 | 6.3 | 2.5 | 5.0 | 1.9 | virginica |
147 | 148 | 6.5 | 3.0 | 5.2 | 2.0 | virginica |
148 | 149 | 6.2 | 3.4 | 5.4 | 2.3 | virginica |
149 | 150 | 5.9 | 3.0 | 5.1 | 1.8 | virginica |
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()
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | deck | embark_town | alive | alone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | NaN | Southampton | no | False |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | NaN | Southampton | yes | True |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | C | Southampton | yes | False |
4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | NaN | Southampton | no | True |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 0 | 2 | male | 27.0 | 0 | 0 | 13.0000 | S | Second | man | True | NaN | Southampton | no | True |
887 | 1 | 1 | female | 19.0 | 0 | 0 | 30.0000 | S | First | woman | False | B | Southampton | yes | True |
888 | 0 | 3 | female | NaN | 1 | 2 | 23.4500 | S | Third | woman | False | NaN | Southampton | no | False |
889 | 1 | 1 | male | 26.0 | 0 | 0 | 30.0000 | C | First | man | True | C | Cherbourg | yes | True |
890 | 0 | 3 | male | 32.0 | 0 | 0 | 7.7500 | Q | Third | man | True | NaN | Queenstown | no | True |
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)#直接做热力图
year | 1949 | 1950 | 1951 | 1952 | 1953 | 1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
month | ||||||||||||
April | 129 | 135 | 163 | 181 | 235 | 227 | 269 | 313 | 348 | 348 | 396 | 461 |
August | 148 | 170 | 199 | 242 | 272 | 293 | 347 | 405 | 467 | 505 | 559 | 606 |
December | 118 | 140 | 166 | 194 | 201 | 229 | 278 | 306 | 336 | 337 | 405 | 432 |
February | 118 | 126 | 150 | 180 | 196 | 188 | 233 | 277 | 301 | 318 | 342 | 391 |
January | 112 | 115 | 145 | 171 | 196 | 204 | 242 | 284 | 315 | 340 | 360 | 417 |
July | 148 | 170 | 199 | 230 | 264 | 302 | 364 | 413 | 465 | 491 | 548 | 622 |
June | 135 | 149 | 178 | 218 | 243 | 264 | 315 | 374 | 422 | 435 | 472 | 535 |
March | 132 | 141 | 178 | 193 | 236 | 235 | 267 | 317 | 356 | 362 | 406 | 419 |
May | 121 | 125 | 172 | 183 | 229 | 234 | 270 | 318 | 355 | 363 | 420 | 472 |
November | 104 | 114 | 146 | 172 | 180 | 203 | 237 | 271 | 305 | 310 | 362 | 390 |
October | 119 | 133 | 162 | 191 | 211 | 229 | 274 | 306 | 347 | 359 | 407 | 461 |
September | 136 | 158 | 184 | 209 | 237 | 259 | 312 | 355 | 404 | 404 | 463 | 508 |
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]:
gender | NationalITy | PlaceofBirth | StageID | GradeID | SectionID | Topic | Semester | Relation | raisedhands | VisITedResources | AnnouncementsView | Discussion | ParentAnsweringSurvey | ParentschoolSatisfaction | StudentAbsenceDays | Class | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | M | KW | KuwaIT | lowerlevel | G-04 | A | IT | F | Father | 15 | 16 | 2 | 20 | Yes | Good | Under-7 | M |
1 | M | KW | KuwaIT | lowerlevel | G-04 | A | IT | F | Father | 20 | 20 | 3 | 25 | Yes | Good | Under-7 | M |
2 | M | KW | KuwaIT | lowerlevel | G-04 | A | IT | F | Father | 10 | 7 | 0 | 30 | No | Bad | Above-7 | L |
3 | M | KW | KuwaIT | lowerlevel | G-04 | A | IT | F | Father | 30 | 25 | 5 | 35 | No | Bad | Above-7 | L |
数据可视化分析
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]:
性别 | 国籍 | 出生地 | 学段 | 年级 | 班级 | 科目 | 学期 | 监管人 | 举手次数 | 浏览课件次数 | 浏览公告次数 | 讨论次数 | 父母问卷 | 家长满意度 | 缺勤次数 | 成绩 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | M | KW | KuwaIT | lowerlevel | G-04 | A | IT | F | Father | 15 | 16 | 2 | 20 | Yes | Good | Under-7 | M |
1 | M | KW | KuwaIT | lowerlevel | G-04 | A | IT | F | Father | 20 | 20 | 3 | 25 | Yes | Good | Under-7 | M |
2 | M | KW | KuwaIT | lowerlevel | G-04 | A | IT | F | Father | 10 | 7 | 0 | 30 | No | Bad | Above-7 | L |
3 | M | KW | KuwaIT | lowerlevel | G-04 | A | IT | F | Father | 30 | 25 | 5 | 35 | No | Bad | Above-7 | L |
4 | M | KW | KuwaIT | lowerlevel | G-04 | A | IT | F | Father | 40 | 50 | 12 | 50 | No | Bad | Above-7 | M |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
475 | F | Jordan | Jordan | MiddleSchool | G-08 | A | Chemistry | S | Father | 5 | 4 | 5 | 8 | No | Bad | Above-7 | L |
476 | F | Jordan | Jordan | MiddleSchool | G-08 | A | Geology | F | Father | 50 | 77 | 14 | 28 | No | Bad | Under-7 | M |
477 | F | Jordan | Jordan | MiddleSchool | G-08 | A | Geology | S | Father | 55 | 74 | 25 | 29 | No | Bad | Under-7 | M |
478 | F | Jordan | Jordan | MiddleSchool | G-08 | A | History | F | Father | 30 | 17 | 14 | 57 | No | Bad | Above-7 | L |
479 | F | Jordan | Jordan | MiddleSchool | G-08 | A | History | S | Father | 35 | 14 | 23 | 62 | No | Bad | Above-7 | L |
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 | 男 | KW | KuwaIT | 小学 | G-04 | A | IT | 秋季 | Father | 15 | 16 | 2 | 20 | Yes | Good | Under-7 | M |
1 | 男 | KW | KuwaIT | 小学 | G-04 | A | IT | 秋季 | Father | 20 | 20 | 3 | 25 | Yes | Good | Under-7 | M |
2 | 男 | KW | KuwaIT | 小学 | G-04 | A | IT | 秋季 | Father | 10 | 7 | 0 | 30 | No | Bad | Above-7 | L |
3 | 男 | KW | KuwaIT | 小学 | G-04 | A | IT | 秋季 | Father | 30 | 25 | 5 | 35 | No | Bad | Above-7 | L |
4 | 男 | KW | KuwaIT | 小学 | G-04 | A | IT | 秋季 | Father | 40 | 50 | 12 | 50 | No | Bad | Above-7 | M |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
475 | 女 | Jordan | Jordan | 中学 | G-08 | A | Chemistry | 春季 | Father | 5 | 4 | 5 | 8 | No | Bad | Above-7 | L |
476 | 女 | Jordan | Jordan | 中学 | G-08 | A | Geology | 秋季 | Father | 50 | 77 | 14 | 28 | No | Bad | Under-7 | M |
477 | 女 | Jordan | Jordan | 中学 | G-08 | A | Geology | 春季 | Father | 55 | 74 | 25 | 29 | No | Bad | Under-7 | M |
478 | 女 | Jordan | Jordan | 中学 | G-08 | A | History | 秋季 | Father | 30 | 17 | 14 | 57 | No | Bad | Above-7 | L |
479 | 女 | Jordan | Jordan | 中学 | G-08 | A | History | 春季 | Father | 35 | 14 | 23 | 62 | No | Bad | Above-7 | L |
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.000000 | 0.691572 | 0.594500 | 0.243292 |
举手次数 | 0.691572 | 1.000000 | 0.643918 | 0.339386 |
浏览公告次数 | 0.594500 | 0.643918 | 1.000000 | 0.417290 |
讨论次数 | 0.243292 | 0.339386 | 0.417290 | 1.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]:
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | deck | embark_town | alive | alone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | NaN | Southampton | no | False |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | NaN | Southampton | yes | True |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | C | Southampton | yes | False |
4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | NaN | Southampton | no | True |
数据可视化
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]:
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | embark_town | alive | alone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | Southampton | no | False |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | Cherbourg | yes | False |
2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | Southampton | yes | True |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | Southampton | yes | False |
4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | Southampton | no | True |
数据探索
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]:
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | embark_town | alive | alone | age_level | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | Southampton | no | False | middle |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | Cherbourg | yes | False | middle |
2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | Southampton | yes | True | middle |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | Southampton | yes | False | middle |
4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | Southampton | no | True | middle |
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>
写在最后:
此处的数据是来源与我自己的数据,想要的宝子可以私信我要奥,也希望我写的博文能帮到你们。文章当中的图片由于一些原因无法展示,希望各位宝子可以见谅哈!各位宝子也可以自行验证