本文涵盖Mtplotlib画图的所有知识的和美化,源代码和数据均在github已上传,欢迎star哦:
https://github.com/w1449550206/Matplotlib.git
学完本文,您会收获些什么?
- 知道Matplotlib的架构
- 应用Matplotlib的基本功能实现图形显示
- 应用Matplotlib实现多图显示
- 应用Matplotlib实现不同画图种类
注意:学习这个工具要知道他是怎么使用的,要掌握的是逻辑
一、Matplotlib之HelloWorld
学完本节,您会收获些什么?
- 了解什么是matplotlib
- 为什么要学习matplotlib
- matplotlib的三层结构介绍
- 应用
1 什么是Matplotlib
-
是专门用于开发2D图表(包括3D图表)
-
使用起来及其简单
-
以渐进、交互式方式实现数据可视化
数据可视化 画图
要学会怎么使用,主要掌握的要是逻辑
学会常见图形
折线图 散点图 柱状图 直方图 饼图
2 为什么要学习Matplotlib
可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法。
- 能将数据进行可视化,更直观的呈现
- 使数据更加客观、更具说服力
例如下面两个图为数字展示和图形展示:
3 实现一个简单的Matplotlib画图
import matplotlib.pyplot as plt
# 1.创建画布
plt.figure(figsize=(20,8), dpi=100)
# 2.绘制图像
x = [1,2,3]
y = [4,5,6]
plt.plot(x, y)
# 3.显示图像
plt.show()
4 认识Matplotlib图像结构(拓展,了解)
5 Matplotlib三层结构(拓展,了解)
5.1 容器层
容器层主要由Canvas、Figure、Axes组成。
Canvas画板(只有一个不用去管)
Figure画布(只有一个不用去管,接受一下即可)
Axes绘图区域(重点,有可能在旁边画好几个图,所以是一个二维数组)
Canvas是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具。
Figure是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色。
Axes是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。
- Figure:指整个图形(可以通过plt.figure()设置画布的大小和分辨率等)
- Axes(坐标系):数据的绘图区域
- Axis(坐标轴):坐标系中的一条轴,包含大小限制、刻度和刻度标签
特点为:
- 一个figure(图像)可以包含多个axes(坐标系/绘图区),但是一个axes只能属于一个figure。
- 一个axes(坐标系/绘图区)可以包含多个axis(坐标轴),包含两个即为2d坐标系,3个即为3d坐标系
5.2 辅助显示层
辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)等内容。
该层的设置可使图像显示更加直观更加容易被用户理解,但又不会对图像产生实质的影响。
5.3 图像层
图像层指Axes内通过plot线形图、scatte散点图、bar柱状、histogram直方、pie饼图等函数根据数据绘制出的图像。
- 总结:
- Canvas(画板)位于最底层,用户一般接触不到
- Figure(画布)建立在Canvas之上
- Axes(绘图区)建立在Figure之上
- 坐标轴(axis)、图例(legend)等辅助显示层以及图像层都是建立在Axes之上
6 小结
- 什么是matplotlib【了解】
- 是专门用于开发2D(3D)图表的包
- 绘制图像流程【掌握】
- 1.创建画布 – plt.figure(figsize=(20,8))
- 2.绘制图像 – plt.plot(x, y)
- 3.显示图像 – plt.show()
- matplotlib图像结构【了解】
- 容器层
- Canvas – 画板
- 是底层实现,不需要关注
- Figure – 画布
- 在使用之前,每次都需要进行实例化
- axes – 坐标系
- 数据的绘图区域
- Canvas – 画板
- 辅助显示层
- 主要作用添加坐标轴描述,标题等内容
- 图像层
- 设定要画一个什么样的图像:plot,scatter…
- 容器层
二、折线图(plot)与基础绘图功能
学完本节,您会收获些什么?
- 学习折线图的绘制和图形保存
- 给图形添加辅助功能(如:标注、x,y轴名称、标题等)
- 多次plot绘制图形
- 多个坐标系显示图形
- 知道折线图的应用场景
- 应用
- 天气的温度变化显示
1 折线图绘制与保存图片
简单绘制
#导入matplotlib
import matplotlib.pyplot as plt
#创建画布 figsize画布大小 dpi像素密度
#只绘制一个图的话不用去设置绘图区域
plt.figure(figsize=(20,8),dpi=100)
#绘制图像
plt.plot([1,2,3,4,5,6,7],[1,4,9,16,25,36,49])
#显示图像
plt.show()
为了更好地理解所有基础绘图功能,我们通过天气温度变化的绘图来融合所有的基础API使用
1.1 matplotlib.pyplot模块
matplotlib.pytplot包含了一系列类似于matlab的画图函数。 它的函数作用于当前图形(figure)的当前坐标系(axes)。
import matplotlib.pyplot as plt
1.2 折线图绘制与显示
绘制安徽省宣城市泾县未来一周的最低气温2020.02.29-2020.03.06
#导入工具
import matplotlib.pyplot as plt
#创建画布
plt.figure(figsize=(20,8),dpi = 100)
#绘制图像,绘制安徽省宣城市泾县未来一周的最低气温2020.02.29-2020.03.06
plt.plot([1,2,3,4,5,6,7],[9,7,6,7,4,6,8])
#显示图像
plt.show()#如果不用show的话,只是在缓存中
展现上海一周的天气,比如从星期一到星期日的天气温度如下
# 1.创建画布(容器层)
plt.figure(figsize=(10, 10))
# 2.绘制折线图(图像层)
plt.plot([1, 2, 3, 4, 5, 6 ,7], [17,17,18,15,11,11,13])
# 3.显示图像
plt.show()
可以看到这样显示效果并不好,我们可以加入更多的功能:
1.3 设置画布属性与图片保存
保存图像
#导入工具
import matplotlib.pyplot as plt
#创建画布
plt.figure(figsize=(20,8),dpi = 100)
#绘制图像,绘制安徽省宣城市泾县未来一周的最低气温2020.02.29-2020.03.06
plt.plot([1,2,3,4,5,6,7],[9,7,6,7,4,6,8])
#保存图像
plt.savefig('./安徽省宣城市泾县未来一周最低气温折线图')
#显示图像
plt.show()#如果不用show的话,只是在缓存中
如果在show后面再执行保存代码,那么就会失败!!!
因为绘制图像立马保存在内存中,直接save可以,但是用了show之后,内存就会清空,我们再去保存的话,就是空白的
因此,保存图像,必须在显示图像之前
savefig必须在show之前!!!!!!!!!!!!
plt.figure(figsize=(), dpi=)
figsize:指定图的长宽
dpi:图像的清晰度
返回fig对象
plt.savefig(path)
# 1.创建画布,并设置画布属性
plt.figure(figsize=(20, 8), dpi=80)
# 2.保存图片到指定路径
plt.savefig("test.png")
- 注意:plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。
2 完善原始折线图1(辅助显示层)
案例:显示温度变化状况
需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度(随机产生)
效果:
2.1 准备数据并画出初始折线图
# 画出温度变化图
# 0.准备x, y坐标的数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2.绘制折线图
plt.plot(x, y_shanghai)
# 3.显示图像
plt.show()
2.2 添加自定义x,y刻度
-
plt.xticks(x, **kwargs)
x:要显示的刻度值
-
plt.yticks(y, **kwargs)
y:要显示的刻度值
# 增加以下两行代码
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(40)
# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
如果没有解决过中文问题的话,会显示这个样子:
加了刻度的案例
#导入工具
import matplotlib.pyplot as plt
import random
#创建画布
plt.figure(figsize=(20,8),dpi = 80)
#绘制图像,画出安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图,
#温度范围在15度~18度(随机产生)
x = range(60)
y_jingxian = [random.uniform(15,18) for i in x]#列表生成式,uniform定义范围得到一个随机数
plt.plot(x,y_jingxian)
plt.rcParams['font.family']=['SimHei']
#添加描述信息
plt.xlabel('时间',fontsize = 20)
plt.ylabel('温度',fontsize = 20)
plt.title('安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图',fontsize = 20)
# # 添加x坐标轴刻度
x_tick_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5],x_tick_label[::5])# [::5]是每隔五个选一个,后面的也要对应上
# # 添加y坐标轴刻度
y_range = range(40)
plt.yticks(y_range[::5])#[::5]是每隔五个选一个
#保存图像
plt.savefig('./安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图.png')
#显示图像
plt.show()#如果不用show的话,只是在缓存中
2.3 中文显示问题解决
windows
【重要】设置支持中文,windows可以设置字体位置,但是linux’不行,所以我们要记住这个方法
plt.rcParams['font.family'] = ['SimHei']
#导入工具
import matplotlib.pyplot as plt
import random
#创建画布
plt.figure(figsize=(20,8),dpi = 80)
#绘制图像,画出安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图,
#温度范围在15度~18度(随机产生)
x = range(60)
y_jingxian = [random.uniform(15,18) for i in x]#列表生成式,uniform定义范围得到一个随机数
plt.plot(x,y_jingxian)
plt.rcParams['font.family']=['SimHei']
#添加描述信息
plt.xlabel('时间',fontsize = 20)
plt.ylabel('while度',fontsize = 20)
plt.title('安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图',fontsize = 20)
#保存图像
plt.savefig('./安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图.png')
#显示图像
plt.show()#如果不用show的话,只是在缓存中
非windos
下载中文字体(黑体,看准系统版本)
-
下载 SimHei字体(或者其他的支持中文显示的字体也行)
这个字体网上可以下载到,如果找不到可以评论or私信我 -
安装字体
-
linux下:拷贝字体到 usr/share/fonts 下:
sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf
-
windows和mac下:双击安装
-
-
删除~/.matplotlib中的缓存文件
cd ~/.matplotlib rm -r *
-
修改配置文件matplotlibrc
vi ~/.matplotlib/matplotlibrc
将文件内容修改为:
font.family : sans-serif font.sans-serif : SimHei axes.unicode_minus : False
就ok了
2.4 添加网格显示
为了更加清楚地观察图形对应的值
plt.grid(True, linestyle='--', alpha=0.5)
注意线型可以选择的有
风格字符 |
---|
- 实线 |
- - 虚线 |
-. 点划线 |
: 点虚线 |
’ ’ 留空、空格 |
加了网格显示的案例
#导入工具
import matplotlib.pyplot as plt
import random
#创建画布
plt.figure(figsize=(20,8),dpi = 80)
#绘制图像,画出安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图,
#温度范围在15度~18度(随机产生)
x = range(