第八章 绘图
通过介绍Matplotlib模块、Seaborn模块、Bokeh交互式绘图,向读者逐步呈现Python由基础到高级绘图的方法。(画图,难道不是有手就行?)
Matplotlib绘图基础
基本特点
Matpltlob图像可分为四层结构:
1) canvas(画板)。位于最底层,导入matplotlib库时就自动存在。
2) figure(画布)。建立在canvas之上,从这一层就能开始设置其参数。
3) axes(子图)。将figure分成不同块,实现分面绘图。
4) 图表信息(构图元素)。添加或修改axes上的图形信息,优化图表的显示效果。
Matplotlib通过pyplot模块提供了一套与Matlab类似的命令API,创建好画布后,只需调用pyplot模块所提供的函数,仅几行代码就可以实现添加、修改图形元素,或在原有图形上绘制新图形。
主要分三个部分:
1)导入模块
2)创建画布与创建子图
3)添加画布内容
4)图形保存和展示
(实战后就会发现跟matlab绘图很像)
可使用库中的savefig()函数保存图片,show()展示图形,text()能够在任意地方添加文本。
绘图类型
在matplotlib模块载入时会调用rc_params函数,并把得到的配置字典保存到rcParams变量中。通过修改字典的方式或用matplotlib.rc()函数修改rc参数。修改默认rc参数后,图形对应属性就会发生改变。
Seaborn进阶绘图
基本特点
Seaborn有如下特点:
1) 基于Matplotlib绘图风格,增加了一些绘图模式
2) 增加调色板功能,具有色彩丰富的显示数据模式
3) 面向整个数据集,可显示多个变量之间的关系
4) 可视化单变量和双变量分布以及在数据子集间进行比较
5) 不同种类因变量的线性回归模型的自动估计和绘图
6) 方便查看复杂数据集的整体结构
7) 灵活处理时间序列数据
8) 利用网格建立复杂图像集
Seaborn模块中通过功能划分,一共有5类21种图形,每一类绘图函数的参数和使用方法都基本一致。使用get_dataset_names函数获取全部内置数据集名称。使用load_dataset函数导入数据。
绘图类型
Seaborn具有丰富的绘图风格,可产生更为美观的图形展示
Bokeh交互式绘图
基本特点
Bokeh是一个专门针对Web浏览器的呈现功能的交互式可视化Python库,能够绘制会“运动”、含有链接等的动态图片,这是Bokeh有其他可视化库最核心的区别。有5点优势:
1) Bokeh允许通过简单的指令就快速地创建复杂的统计图。
2) Bokeh提供到各种媒体,如HTML、Notebook文档和服务器的输出。
3) 可以将Bokeh可视化嵌入flash和django程序。
4) Bokeh可以转换写在其他库(如matplotlib、seaborn和ggplot)中的可视化。
5) Bokeh能灵活地将交互式应用、布局和不同样式选择用于可视化。
基本操作方法同其他作图库类似。
在jupyter中使用output_notebook函数来设置输出模式(加载交互式界面),使用figure函数创建绘图区域。绘制完图形,最后用show函数与save函数来展示与保存图形。
Bokeh能接受HTML和CSS颜色规范种定义的147种颜色名,也能接受RGB颜色值,如“#FF0000”,还有3维元组(r,g,b)、4维元组(r,g,b,a)等。图形有线条属性、填充属性和文本属性等。
Bokeh接收多种形式的数据源,并将这些形式的数据转化成ColumnDataSource对象。一般默认会将数据转化,有时候也需要显式地通过ColumnDataSource函数转化。
添加图形的注解使用Bokeh库下的annotations模块。Span函数能够给图形添加水平或垂直跨度线。Label函数通过坐标定位在图上任意一点并添加注释。
使用row函数或者column函数可以排列一个个图形。
绘图类型
第八章课后题概述
-
D
xlabel是在当前图形中添加x轴名称,可以指定位置、颜色、字体大小等参数;xlim指定当前图形x轴的范围,只能确定一个数值区间,而无法使用字符串标识; xticks指定x轴刻度的数目与取值 -
B
保存图片和展示图片并无先后顺序,图片可展示也可不展示,可保存也可不保存,关键是我们是否书写了那行代码 -
C
编写代码进行运行判断
A是一致的
B也是一致的
C当不被提供时,默认参数为none
D项印刷错误。
-
D
rugplot用于绘制显示数据刻度的地毯图,辅助显示数据的分布特点。只需接受一个参数a即可。其余三个函数均需要接受x,y和data三组的变量 -
填空题
(1)Matplotlib绘制图形的层级是4层。 *canvas(画板)、figure(画布)、axes(子图)、图表信息(构图元素)
(2)Seaborn中预设的主题样式有darkgrid(灰色背景+白网格)、whitegrid(白色背景+黑网格)、dark(仅灰色背景)、white(仅白色背景)和ticks(坐标轴带刻度)。 *5种
(3)Seaborn中分类图各函数用来分组的参数有hue。 *hue传入分类变量,后两者接受字符串列表,指定绘图分类级别,默认为None
(4)Bokeh绘图以Web浏览器为基础,Seaborn绘图以Matplotlib为基础。
(5)想要实现绘制条形图,可以用三种库中的Matplotlib。 -
散点图绘制
import matplotlib.pyplot as plt
import numpy as np
data = np.load('C:\\Users\\Lenovo\\Desktop\\国民经济核算季度数据.npz')
name = data['columns'] # 提取columns数组,视为数据的标签
values = data['values'] # 提取values数组,数据的存在位置
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 各产业
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter( values[: ,1],values[: ,3])
ax1.scatter( values[: ,1],values[: ,4])
ax1.scatter( values[: ,1],values[: , 5])
ax1.legend(['第一产业', '第二产业', '第三产业'])
ax1.set_xlabel('年份')
ax1.set_ylabel('生产总值(亿元)')
ax1.set_xticks(values[range(0, 70, 4), 1])
plt.setp(ax1.get_xticklabels(), rotation=50, horizontalalignment='right',size = 5.5)
ax1.set_title('2000 ~ 2017年季度各产业生产总值散点图')
# 各行业
ax2.scatter( values[: ,1],values[: ,6])
ax2.scatter( values[: ,1],values[: ,7])
ax2.scatter( values[: ,1],values[: ,8])
ax2.scatter( values[: ,1],values[: ,9])
ax2.scatter( values[: ,1],values[: ,10])
ax2.scatter( values[: ,1],values[: ,11])
ax2.scatter( values[: ,1],values[: ,12])
ax2.scatter( values[: ,1],values[: ,13])
ax2.scatter( values[: ,1],values[: ,14])
ax2.legend(['农林牧渔业', '工业', '建筑业', '批发和零售业', '交通运输、仓储和邮政业', '住宿和餐饮业', '金融业', '房地产业','其他行业'])
ax2.set_xlabel('年份')
ax2.set_ylabel('生产总值(亿元)')
ax2.set_xticks(values[range(0, 70, 4), 1])
plt.setp(ax2.get_xticklabels(), rotation=50, horizontalalignment='right',size = 5.5)
ax2.set_title('2000 ~ 2017年季度各行业生产总值散点图')
plt.savefig('C:\\Users\\Lenovo\\Desktop\\国民经济核算季度数据统计图.png')
plt.show()
- 小提琴图绘制
import seaborn as sns
import matplotlib.pyplot as plt
titanic=sns.load_dataset('titanic')
print(titanic)
sns.violinplot(x='age',y='embark_town',hue='sex',data=titanic, palette='Set3',cut=1)
plt.savefig('C:\\Users\\Lenovo\\Desktop\\小提琴图.png')
plt.show()
由于获取数据失败,绘图失败,报错如下(因为连接外网失败了)
TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
可将相应的数据下载到本地后再进行绘图操作,这个数据集在github上有,选择zip下载。
将解压后的文件转移至 C:\Users\Lenovo\seaborn-data 路径下,即seaborn-data那个文件里。
再次运行代码,就可以得到绘制后的小提琴图了。
注:代码除部分经本人修改外,主要来自 机械工业出版社的《Python3智能数据分析快速入门》 的配套资料。