您的位置:首页 > 编程语言 > PHP开发

Matplotlib 绘图教程(seaborn使用)

2017-09-04 10:16 691 查看


一、实验介绍


1.1 实验内容

Matplotlib 是支持 Python 语言的开源绘图库,因为其支持丰富的绘图类型、简单的绘图方式以及完善的接口文档,深受 Python 工程师、科研学者、数据工程师等各类人士的喜欢。这是 Matplotlib 绘图课程的第 4 章节,将带你了解以 Matplotlib 为核心库的高级绘图库 Seaborn,无需经过复杂的自定义即可绘制出更加漂亮的图形。


1.2 实验知识点

Seaborn 高级绘图库使用


1.3 实验环境

python2.7
Xfce 终端
ipython 终端


1.4 适合人群

本课程难度为一般,属于初级级别课程,适合具有 Python 基础,并对使用 Matplotlib 绘图感兴趣的用户。


二、使用 Seaborn 绘图


2.1 Seaborn 简介

Matplotlib 应该是基于 python 语言最优秀的绘图库了,但是它也有一个十分令人头疼的问题,那就是太过于复杂了。3000 多页的官方文档,上千个方法以及数万个参数,属于典型的你可以用它做任何事,但又无从下手。

尤其是,当你像通过 Matplotlib 调出非常漂亮的效果时,往往会伤透脑筋,非常麻烦。

Seaborn 基于 Matplotlib 核心库进行了更高级的 API 封装,可以让你轻松地画出更漂亮的图形。而 Seaborn 的漂亮主要体现在配色更加舒服、以及图形元素的样式更加细腻。

下图是 Seaborn 官方给出的两个示例。



我们列举一下 Seaborn 的几个特点:
内置数个经过优化的样式效果。
增加调色板工具,可以很方便地为数据搭配颜色。
单变量和双变量分布绘图更为简单,可用于对数据子集相互比较。
对独立变量和相关变量进行回归拟合和可视化更加便捷。
对数据矩阵进行可视化,并使用聚类算法进行分析。
基于时间序列的绘制和统计功能,更加灵活的不确定度估计。
基于网格绘制出更加复杂的图像集合。

除此之外, Seaborn 对 Matplotlib 和 Pandas 的数据结构高度兼容 ,非常适合作为数据挖掘过程中的可视化工具。


2.2 Seaborn 安装

实验楼的在线环境未预置 Seaborn 模块,需要自行安装。打开终端,并输入安装命令。一般情况下,会在几秒钟内安装完毕。
sudo pip install seaborn


如果上述命令无法正常安装,可以尝试备用方案:
sudo pip install git+https://github.com/mwaskom/seaborn.git


三、Seaborn 绘图实战


3.1 如何对原图样式进行快速优化?

本课程前面的几个章节,都是在介绍使用 Matplotlib 绘图,并列举了一些小例子。那么,如何使用 Seaborn 对前面的示例进行快速的样式优化?

答案:只需要增加两行代码。

我们用第 2 节里绘制过的混合图举例,增加的两行代码如下:
import seaborn as sns # 导入 seaborn 模块

sns.set() # 使用 set() 方法 1 步设置默认样式


那么,完整的代码如下。注意,sns.set() 样式设置语句需要放置在 Matplotlib 原本的绘图语句前面。
import matplotlib.pyplot as plt
import seaborn as sns

x = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
y_bar = [3, 4, 6, 8, 9, 10, 9, 11, 7, 8]
y_line = [2, 3, 5, 7, 8, 9, 8, 10, 6, 7]

sns.set()

plt.bar(x, y_bar)
plt.plot(x, y_line, '-o', color='y')

plt.show()


你可以通过在线环境左下角的应用程序菜单 > 附件,打开 ipython 交互式终端执行代码。



我们可以发现,相比于 Matplotlib 默认的纯白色背景,Seaborn 默认的浅灰色网格背景看起来的确要细腻舒适一些。而柱状图的色调、坐标轴的字体大小也都有一些变化。

这里,sns.set() 采用了默认参数,分别为:
sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=False, rc=None)


其中:
context=''
 参数控制着默认的画幅大小,分别有 
{paper,
notebook, talk, poster}
 四个值。其中,
poster > talk > notebook > paper

style=''
 参数控制默认样式,分别有 
{darkgrid,
whitegrid, dark, white, ticks}
,你可以自行更改查看它们之间的不同。
palette=''
 参数为预设的调色板。分别有 
{deep,
muted, bright, pastel, dark, colorblind}
 等,你可以自行更改查看它们之间的不同。

剩下的 
font=''
 用于设置字体,
font_scale=
 设置字体大小,
color_codes=
 不使用调色板而采用先前的 
'r'
 等色彩缩写。

Seaborn 一共拥有 50 多个 API 类,相比于 Matplotlib 数千个的规模,可以算作是短小精悍了。

接下来,对 Seaborn 常用的 API 逐一介绍,并通过几个小例子,学会使用 Seaborn 绘图。


3.2 seaborn.lmplot()

seaborn.lmplot()
 是一个非常有用的方法,它会在绘制二维散点图时,自动完成回归拟合。我们拿 UCI 提供的 iris
鸢尾花数据集举例。

在绘图之前,我们先熟悉一下 iris 鸢尾花数据集。数据集总共 150 行,由 5 列组成。分别代表:萼片长度、萼片宽度、花瓣长度、花瓣宽度、花的类别。其中,前四列均为数值型数据,最后一列花的分类为三种,分别是:Iris Setosa、Iris Versicolour、Iris Virginica。

导入这个数据集很简单,这里我们通过 Seaborn 内置的数据集类之间导入。下面,打开 ipython 终端。
import seaborn as sns  #载入 seaborn 模块

iris_data = sns.load_dataset('iris')  # 导入 iris 数据集
print iris_data  #输出预览该数据集




好了,熟悉完数据集,接下来开始绘图了。我们尝试通过 seaborn.lmplot() 将第一列和第二列绘制为散点图。
# 载入绘图模块
import matplotlib.pyplot as plt
import seaborn as sns

# 加载数据
iris_data = sns.load_dataset('iris')

# 绘图
sns.lmplot(x='sepal_length', y='sepal_width', hue='species', data=iris_data)
plt.show()




sns.lmplot()
 里的 
x
y
 分别代表横纵坐标的列名。
hue=
 代表按照
species,即花的类别分类显示,而 
data=
 自然就是关联到数据集了。

由于 Seaborn 对 Pandas 的 DataFrame 数据格式高度兼容,所以一切变得异常简单。绘制出来的图也自动带有图例,并进行了线型回归拟合,还给出了置信区间。


3.3 seaborn.PairGrid

seaborn.PairGrid()
 可以用来查看两个维度数据之间的关系,用处当然也非常多了。比如,方便我们在数据分析过程中找出强关联特征。
# 载入绘图模块
import matplotlib.pyplot as plt
import seaborn as sns

# 加载数据
iris_data = sns.load_dataset('iris')

# 绘图
sns.PairGrid(data=iris_data).map(plt.scatter)
plt.show()


seaborn.PairGrid()
 用法非常简单,只需要将整个数据集放进去,然后使用 
seaborn.PairGrid().map()
 设置绘图的样式,比如这里选择了
scatter 散点图。



Seaborn 自动将 4 个维度的数值型数据进行两两配对,绘制除了 16 张散点图。

如果你认为一种颜色不好看,那么只需要像上面一样,添加 
hue=
 参数即可。比如,这里按照花的类别显示。
# 载入绘图模块
import matplotlib.pyplot as plt
import seaborn as sns

# 加载数据
iris_data = sns.load_dataset('iris')

# 绘图
sns.PairGrid(data=iris_data, hue='species').map(plt.scatter)
plt.show()





3.4 seaborn.PairGrid

seaborn.PairGrid()
 可以绘制出单变量和双变量的组合图,就如同本节一开始给出的第一张官方示例图的效果,我们一起来看一下。
# 载入绘图模块
import matplotlib.pyplot as plt
import seaborn as sns

# 加载数据
iris_data = sns.load_dataset('iris')

# 绘图
sns.JointGrid(data=iris_data, x='sepal_length', y='sepal_width')
plt.show()


你会发现,这样绘制出来是一张空白图。原因是我们没有选择图的样式。



sns.JointGrid().plot()
 用于设置图形的样式。我们将中间的图选为双变量的散点图,而上面和右面选为单变量的直方图。更改一行代码,其余不变,再试一次。
sns.JointGrid(data=iris_data, x='sepal_length', y='sepal_width').plot(sns.regplot, sns.distplot)
plt.show()


这里,我们选择了 seaborn 带有的回归拟合散点图以及单变量分布图。




3.5 seaborn.kdeplot

seaborn.kdeplot()
 主要是用于绘制单变量或二元变量的核密度估计图。先看看单变量的效果。
# 载入绘图模块
import matplotlib.pyplot as plt
import seaborn as sns

# 加载数据
iris_data = sns.load_dataset('iris')

# 绘图
sns.kdeplot(data=iris_data["sepal_length"])

plt.show()


绘制单变量时,直接将一维数组输入即可。



你可以通过 
kernel=
 参数设置核函数,有 
{'gau'
| 'cos' | 'biw' | 'epa' | 'tri' | 'triw' }
等,默认为 
kernel='gau'
。还可以通过其他参数更改绘制的效果,例如。
sns.kdeplot(data=iris_data["sepal_length"], shade=True, color='y')

plt.show()




对于二元变量来讲,就是再再输入一个一维数组即可。
sns.kdeplot(data=iris_data["sepal_length"], data2=iris_data["sepal_width"], shade=True)

plt.show()





3.6 seaborn.heatmap

seaborn.heatmap()
 主要是用于绘制热力图,也就类似于色彩矩阵。
# 载入绘图模块
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# 生成 10x10 的随机矩阵
matrix_data = np.random.rand(10, 10)

# 绘图
sns.heatmap(data=matrix_data)

plt.show()





3.7 seaborn.clustermap

seaborn.clustermap()
 可以将矩阵数据集绘制为层次聚类热图。我们依旧以 iris 数据集为例,看一看效果。
# 载入绘图模块
import matplotlib.pyplot as plt
import seaborn as sns

# 加载数据
iris_data = sns.load_dataset('iris')
iris_data.pop("species")  #去掉了花的类别列

# 绘图
sns.clustermap(iris_data)
plt.show()





3.8 其他

除了上面提到的这些类方法,还有一些可以用 seaborn 进行快速绘制的图形样式。这里就不再一一介绍,示例图和对应的方法如下所示。




四、实验总结

本章节对 Seaborn 的用法进行了简单的介绍。这里需要说明一下 Seaborn 和 Matplotlib 之间的关系,Seaborn 并不是为了替代 Matplotlib,而应当被看作是 Matplotlib 的补充。

对于 Matplotlib 而言,它高度可自定义,可以实现任何你想要的效果。而 Seaborn 非常简单快捷,几行代码就可以画出还不赖的图形。


五、课后习题

自己动手实现 3.8 小节里列举的其他 6 种图形样式的绘制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: