一、Matplotlib快速入门
目标
了解什么是matplotlib
为什么要学习matplotlib
matplotlib简单图形的绘制
1、什么是Matplotlib
是专门用于开发2D图表(包括3D图表)
以渐进、交互式方式实现数据可视化
2、为什么要学习Matplotlib
可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法。
能将数据进行可视化,更直观的呈现
使数据更加客观、更具说服力
例如下面两个图为数字展示和图形展示:
3、实现一个简单的Matplotlib画图 — 以折线图为例
3.1 matplotlib.pyplot模块
matplotlib.pytplot包含了一系列类似于matlab的画图函数。
import matplotlib.pyplot as plt3.2 图形绘制流程:
1.创建画布--plt.figure()
plt.figure(figsize=(), dpi=) figsize:指定图的长宽 dpi:图像的清晰度 返回fig对象
2.绘制图像 -- plt.plot(x, y)
以折线图为例
3.显示图像 -- plt.show()
3.3 折线图绘制与显示
举例:展现上海一周的天气,比如从星期一到星期日的天气温度如下
# 导包 import matplotlib.pyplot as plt import random import numpy as np # 解决中文乱码问题. 思路1: 本机(或者虚拟机)安装SimHei字体. 思路2: 导包, 配置字体. # 设置显示中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置正常显示符号 plt.rcParams['axes.unicode_minus'] = False # matplotlib绘图的基本步骤: # 1. 创建画布. # 2. 准备数据集, x轴, y轴. # 可选: 颜色, 线型, 线宽, 标签, 网格, 图例, 标题, 坐标轴标签. # 3. 绘制图像. # 1. 创建画布. # figsize: 宽, 高, dpi: 分辨率(默认是: 100), 越高, 画布越清晰. # 下述画布像素为: 10 * 80, 5 * 80 -> 800, 400 plt.figure(figsize=(10, 5), dpi=80) # 2. 准备数据集, x轴, y轴. x = [1, 2, 3, 4, 5, 6, 7] #x轴 y = [6, 2, 10, 14, 21, 5, 30] # y轴: 温度. plt.plot(x, y) # plot() -> 绘制 折线图. # 3.展示 plt.show()4、认识Matplotlib图像结构
二、Matplotlib基础绘图功能
目标
掌握给图形添加辅助功能(如:标注、x,y轴名称、标题等)
知道图形的保存
知道如何多次plot绘制图形
知道如何多个坐标系显示图形
知道折线图的应用场景
1、完善原始折线图 — 给图形添加辅助功能
为了更好地理解所有基础绘图功能,通过天气温度变化的绘图来融合所有的基础API使用
需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
1.1 准备数据并画出初始折线图
# 1. 准备数据. # x轴 -> 分钟, 一共 60个值. x = range(60) # print(x) # y轴 -> 温度, 范围: 15 ~ 18, 随机生成. y = [random.uniform(5, 18) for i in x] # print(y) # 2. 创建画布. plt.figure(figsize=(20, 8), dpi=80) # 3. 绘制图形. plt.plot(x, y) # 4. 给图标添加辅助功能. # 4.1 添加自定义x,y刻度 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. # 4.3 设置标题 和 x, y轴的 标签. # 5. 保存图形, 细节: plt.show()之后会释放画布资源, 所以要在 plt.show()之前调用, 用于保存图片, 否则图片就是空白的. # 6.显示图形. plt.show()作用:返回一个随机的浮点数,其值在区间
[a, b]之间(包括a和b)。分布:数值在指定区间内是均匀分布的,这意味着每个数值出现的概率是相等的。
1.2 添加自定义x,y刻度
plt.xticks(x, **kwargs)
x:要显示的刻度值
plt.yticks(y, **kwargs)
y:要显示的刻度值
#完善如下代码: # 4. 给图标添加辅助功能. # 4.1 添加自定义x,y刻度 x_ticks_label = [f'11点{i}分' for i in x] # x的范围: [0, 60), x轴的: 刻度标签. # print(x_ticks_label) y_ticks_label = [i for i in range(0, 20)] # print(y_ticks_label) # 具体的设置刻度的操作. #[::5] 为了好看, 间隔设置 plt.xticks(x[::5], x_ticks_label[::5]) # 0 -> '11点0分', 1 -> '11点1分', 2 -> '11点2分'...... plt.yticks(y_ticks_label[::5]) # 0, 1, 2, 3, 4, 5...39效果如下:
如果没有解决过中文问题的话,会显示这个样子:
1.3 中文显示问题解决
解决方案一:
下载中文字体(黑体,看准系统版本)
步骤一:下载 SimHei 字体(或者其他的支持中文显示的字体也行)
步骤二:安装字体
linux下:拷贝字体到 usr/share/fonts 下:
sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttfwindows和mac下:双击安装
步骤三:删除~/.matplotlib中的缓存文件
cd ~/.matplotlib rm -r *步骤四:修改配置文件matplotlibrc
vi ~/.matplotlib/matplotlibrc将文件内容修改为:
font.family : sans-serif font.sans-serif : SimHei axes.unicode_minus : False
解决方案二:
在Python脚本中动态设置matplotlibrc,这样也可以避免由于更改配置文件而造成的麻烦,具体代码如下:
from pylab import mpl # 设置显示中文字体 mpl.rcParams["font.sans-serif"] = ["SimHei"]有时候,字体更改后,会导致坐标轴中的部分字符无法正常显示,此时需要更改axes.unicode_minus参数:
# 设置正常显示符号 mpl.rcParams["axes.unicode_minus"] = False解决方案三:
# 解决中文显示问题,下面的代码只需运行一次即可 import matplotlib as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False1.4 添加网格显示&设置标题, x,y轴标签
为了更加清楚地观察图形对应的值:
plt.grid(True, linestyle='--', alpha=0.5)设置标签:
plt.xlabel("x轴标签")
plt.ylabel("y轴标签")
plt.title("标题", fontsize=20) #fontsize 文字大小
#完善上面代码 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. plt.grid(True, linestyle='-', alpha=0.5) # 4.3 设置标题 和 x, y轴的 标签. plt.xlabel('时间', fontsize=15) plt.ylabel('温度', fontsize=20) plt.title('成都市11点到12点1小时的温度变化', fontsize=20)1.5 图片保存
# 5. 保存图形, 细节: plt.show()之后会释放画布资源, 所以要在 plt.show()之前调用, 用于保存图片, 否则图片就是空白的. plt.savefig('./my.jpg')1.6 完整代码
# 1. 准备数据. # x轴 -> 分钟, 一共 60个值. x = range(60) # print(x) # y轴 -> 温度, 范围: 15 ~ 18, 随机生成. y = [random.uniform(5, 18) for i in x] # print(y) # 2. 创建画布. plt.figure(figsize=(20, 8), dpi=80) # 3. 绘制图形. plt.plot(x, y) # 导包 import matplotlib.pyplot as plt import random import numpy as np # 解决中文乱码问题. 思路1: 本机(或者虚拟机)安装SimHei字体. 思路2: 导包, 配置字体. # 设置显示中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置正常显示符号 plt.rcParams['axes.unicode_minus'] = False # matplotlib绘图的基本步骤: # 1. 创建画布. # 2. 准备数据集, x轴, y轴. # 可选: 颜色, 线型, 线宽, 标签, 网格, 图例, 标题, 坐标轴标签. # 3. 绘制图像. # 4. 给图标添加辅助功能. # 4.1 添加自定义x,y刻度 x_ticks_label = [f'11点{i}分' for i in x] # x的范围: [0, 60), x轴的: 刻度标签. # print(x_ticks_label) y_ticks_label = [i for i in range(0, 20)] # print(y_ticks_label) # 具体的设置刻度的操作. #[::5] 为了好看, 间隔设置 plt.xticks(x[::5], x_ticks_label[::5]) # 0 -> '11点0分', 1 -> '11点1分', 2 -> '11点2分'...... plt.yticks(y_ticks_label[::5]) # 0, 1, 2, 3, 4, 5...39 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. plt.grid(True, linestyle='-', alpha=0.5) # 4.3 设置标题 和 x, y轴的 标签. plt.xlabel('时间', fontsize=15) plt.ylabel('温度', fontsize=20) plt.title('成都市11点到12点1小时的温度变化', fontsize=20) # 5. 保存图形, 细节: plt.show()之后会释放画布资源, 所以要在 plt.show()之前调用, 用于保存图片, 否则图片就是空白的. plt.savefig('./my.jpg') # 6.显示图形. plt.show()2、在一个坐标系中绘制多个图像(多次plot)
需求:再添加一个城市的温度变化
收集到其他城市当天温度变化情况,温度在3度到15度。怎么去添加另一个在同一坐标系当中的不同图形,其实很简单只需要再次plot即可,但是需要区分线条,如下显示:
仔细观察,用到了两个新的地方,一个是对于不同的折线展示效果,一个是添加图例
设置图形风格
eg:
# 3. 绘制图形. plt.plot(x, y_cd, label='成都', color='r') # label -> 图例标签 显示的值, color -> 颜色 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. plt.grid(True, linestyle='--', alpha=0.5)
| 颜色字符 | 风格字符 |
|---|---|
| r 红色 | - 实线 |
| g 绿色 | - - 虚线 |
| b 蓝色 | -. 点划线 |
| w 白色 | : 点虚线 |
| c 青色 | ' ' 留空、空格 |
| m 洋红 | |
| y 黄色 | |
| k 黑色 |
显示图例:
注意:如果只在plt.plot()中设置label还不能最终显示出图例,还需要通过plt.legend()将图例显示出来,eg:
# 4.4 显示图例. # 参1: 图例标签, 参2: 图例的位置. # plt.legend(['成都', '黑龙江'], loc='best') # Location Code -> 图例的位置的值. # 参2: 绘图时如果指定了图例值, 则图例标签可以省略. plt.legend(loc=1) # loc: 图例显示位置 plt.legend(loc='best') # 效果同上.legend里面的loc参数参考值如下:
| Location String | Location Code |
|---|---|
| 'best' | 0 |
| 'upper right' | 1 |
| 'upper left' | 2 |
| 'lower left' | 3 |
| 'lower right' | 4 |
| 'right' | 5 |
| 'center left' | 6 |
| 'center right' | 7 |
| 'lower center' | 8 |
| 'upper center' | 9 |
| 'center' | 10 |
完整代码:
# 需求: 画出成都, 黑龙江, 11点到12点1小时内每分钟的温度变化折线图, 温度范围在: 1 ~ 10 # 1. 准备数据. # x轴 -> 分钟, 一共 60个值. x = range(60) # y轴 -> 温度, 范围: 15 ~ 18, 随机生成. y_cd = [random.uniform(1, 15) for i in x] # y轴 -> 成都. y_hlj = [random.uniform(-20, 3) for i in x] # y轴 -> 黑龙江. # 2. 创建画布. plt.figure(figsize=(20, 5), dpi=80) # 3. 绘制图形. plt.plot(x, y_cd, label='成都', color='r') # label -> 图例标签 显示的值, color -> 颜色 plt.plot(x, y_hlj, label='黑龙江', color='b') # 4. 给图标添加辅助功能. # 4.1 添加自定义x,y刻度 x_ticks_label = [f'11点{i}分' for i in x] # x的范围: [0, 60), x轴的: 刻度标签. y_ticks_label = [i for i in range(-30, 20)] # 具体的设置刻度的操作. [::5]: 表示获取所有数据, 步长为5 显示 plt.xticks(x[::5], x_ticks_label[::5]) # 0 -> '11点0分', 1 -> '11点1分', 2 -> '11点2分'...... plt.yticks(y_ticks_label[::5]) # -30, -29, ...20 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. plt.grid(True, linestyle='--', alpha=0.5) # 4.3 设置标题 和 x, y轴的 标签. plt.xlabel('时间', fontsize=15) plt.ylabel('温度', fontsize=15) plt.title('成功/黑龙江 11点到12点1小时的温度变化', fontsize=20) # 4.4 显示图例. # 参1: 图例标签, 参2: 图例的位置. # plt.legend(['成都', '黑龙江'], loc='best') # Location Code -> 图例的位置的值. # 参2: 绘图时如果指定了图例值, 则图例标签可以省略. plt.legend(loc=1) # loc: 图例显示位置 plt.legend(loc='best') # 效果同上. # 5. 保存图形, 细节: plt.show()之后会释放画布资源, 所以要在 plt.show()之前调用, 用于保存图片, 否则图片就是空白的. plt.savefig('./my2.jpg') # 6.显示图形. plt.show()效果图如下:
3.多个坐标系显示— plt.subplots(面向对象的画图方法)
如果想要将成都和重庆的天气图显示在同一个图的不同坐标系当中,效果如下:
可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数:
- matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 创建一个带有多个axes(坐标系/绘图区)的图
Parameters: nrows, ncols : 设置有几行几列坐标系 int, optional, default: 1, Number of rows/columns of the subplot grid. Returns: fig : 图对象 axes : 返回相应数量的坐标系 设置标题等方法不同: set_xticks set_yticks set_xlabel set_ylabel
- 关于axes子坐标系的更多方法:参考https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes
- 注意:plt.函数名()相当于面向过程的画图方法,ax.set_方法名()相当于面向对象的画图方法。
- 代码如下:
# 需求: 画出成都, 黑龙江, 11点到12点1小时内每分钟的温度变化折线图, 温度范围在: 1 ~ 10 # 1. 准备数据. x轴 -> 时间, y轴 -> 温度. x = range(60) y_cd = [random.uniform(-3, 15) for i in x] # 成都温度 y_hlj = [random.uniform(-20, 10) for i in x] # 黑龙江温度 # 2. 创建画布. # plt.figure(figsize=(20, 8), dpi=80) # 面向过程版, 即: 所有的函数都是 plt. 的方式调用的. # 面向对象版绘图, fig -> 画布(1行2列的画布), ax -> 坐标系 plg, ax = plt.subplots(figsize=(20, 8), nrows=1, ncols=2) # 3. 具体的绘制图像的动作.color: 线的颜色, label: 标签名称, linstyle: 线的格式 # ax[0] -> 坐标系的0行0列 ax[0].plot(x, y_cd, color='r', label='成都') # ax[1] -> 坐标系的0行1列 ax[1].plot(x, y_hlj, color='y', label='黑龙江', linestyle='--') # 4. 添加刻度 # 4.1 定义变量, 表示: x轴, y轴刻度的范围. x_ticks_label = [f'11点{i}分' for i in x] y_ticks = [i for i in range(-30, 20)] # 4.2 具体的添加刻度的操作. ax[0].set_xticks(x[::5]) # 图1的: x轴的刻度值 ax[0].set_yticks(y_ticks[::5]) # 图1的: y轴的刻度值 ax[0].set_xticklabels(x_ticks_label[::5]) # 图1的: x轴的(刻度)标签值 ax[1].set_xticks(x[::5]) # 图2的: x轴的刻度值 ax[1].set_yticks(y_ticks[::5]) # 图2的: y轴的刻度值 ax[1].set_xticklabels(x_ticks_label[::5]) # 图2的: x轴的(刻度)标签值 # 5. 设置标题 和 x, y轴标签. ax[0].set_xlabel('温度', fontsize=15) ax[0].set_ylabel('湿度', fontsize=15) ax[0].set_title('成都11点到12点1小时的温度变化', fontsize=20) ax[1].set_xlabel('温度', fontsize=15) ax[1].set_ylabel('湿度', fontsize=15) ax[1].set_title('重庆11点到12点1小时的温度变化', fontsize=20) # 6. 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. ax[0].grid(True, linestyle='--', alpha=0.5) ax[1].grid(True, linestyle='-.', alpha=0.5) # 7. 添加图例. ax[0].legend(loc='best') ax[1].legend(loc=0) # 效果同上, 0 -> base, 自动匹配最佳位置. # 8. 保存图片. plt.savefig('./my.jpg') # 9. 显示图像. plt.show()4.绘制 数学-数字关系图
import numpy as np # 1.准备数据 x = np.linspace(-10, 10, 500) y = np.sin(x) # 1.创建画布 plt.figure(figsize=(20, 8), dpi=90) # 2.绘制函数图像 plt.plot(x, y) # 2.1 添加网格显示 plt.grid() # 3.显示图像 plt.show()应用场景:
呈现公司产品(不同区域)每天活跃用户数
呈现app每天下载数量
呈现产品新功能上线后,用户点击次数随时间的变化
拓展:画各种数学函数图像
注意:plt.plot()除了可以画折线图,也可以用于画各种数学函数图像
三、常见图形绘制
1、官方案例库
https://matplotlib.org/stable/gallery/index.html
2、常见图形种类及意义
- 常见图形绘制如下:折线图( plot() ), 柱状图( bar() ), 直方图( hist() ) 饼图( pie() ), 散点图( scatter() )......
- Matplotlib官方绘图网址 参考:https://matplotlib.org/stable/gallery/index.html
2.1 折线图
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
api:plt.plot(x, y)
2.2 柱形图
柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
api:plt.bar(x, width, align='center', **kwargs)
Parameters: x : 需要传递的数据 width : 柱状图的宽度 align : 每个柱状图的位置对齐方式 {'center', 'edge'}, optional, default: 'center' **kwargs : color:选择柱状图的颜色# 绘制 柱形图. # 1. 准备数据. x = ['A', 'B', 'C', 'D', 'E'] y = [3, 6, 1, 8, 2] # 创建画布, 如果不写, 系统会默认创建1个画布. # plt.figure(figsize=(20, 8)) # 2. 绘制柱状图. plt.bar(x, y, color='r') # 3. 设置x轴, y轴标签 和 标题. plt.xlabel('分类名') plt.ylabel('商品个数') plt.title('商品分类统计图', fontsize=15) # 4. 显示图像. plt.show()2.3 直方图
由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)
api:matplotlib.pyplot.hist(x, bins=None)
Parameters: x : 需要传递的数据 bins : 组距# 绘制 直方图 -> 适用于 统计分析, 查看(每组)数据的分布情况. # 直方图原理: 相当于把 原数据分成 长度为 区间数 + 1的等差数列, 每两个值 = 1个区间. # 柱状图: 展示 单个分类 的值的分布情况. # 直方图: 展示 区间值 的分布情况. # 1. 准备数据. data = np.random.randint(0, 150, 100) # data # 100个 0 ~ 150 之间的随机整数. # 回顾: 等差数列, 0 ~ 150之间, 11个数. # print(np.linspace(0, 150, 11)) # [0. 15. 30. 45. 60. 75. 90. 105. 120. 135. 150.] # 2. 创建画板. plt.figure(figsize=(20, 8)) # 3. 绘制图形. # 参1: 绘制的数据. # 参2: 直方图的分段数量(即: 几个区间). # 参3: 颜色, # 参4: 透明度, 参5: 柱子的宽度. plt.hist(data, bins=10, color='b', alpha=0.5, rwidth=0.85) # 4. 设置 x轴, y轴标签 和 标题. plt.xlabel('商品价格区间') plt.ylabel('商品个数') plt.title('商品价格区间分布图', fontsize=15) # 5. 显示图形. plt.show()2.4 饼图
饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)
api:plt.pie(x, labels=,autopct=,colors)
Parameters: x:数量,自动算百分比 labels:每部分名称 autopct:占比显示指定%1.2f%% colors:每部分颜色
# 绘制 饼图, 每个分类的占比情况. # 1. 参数1: 绘制的数据. 参数2: 饼图的标签. sizes = [25, 35, 25, 15] labels = ['电脑', '手机', '键盘', '鼠标'] # 2. 具体的绘图动作. # 参1: 绘制的数据. # 参2: 饼图的标签. # 参3: 显示百分比, %% 表示 1个 % plt.pie(sizes, labels=labels, autopct='%1.1f%%') # 绘制饼图,显示百分比 plt.title("Simple Pie Chart") # 设置图表标题 # 3. 显示图形. plt.show() # 显示图表2.5 散点图
散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
api:plt.scatter(x, y)
# 散点图, 适用于 散点分析, 即: 两个值之间的关系. x = [1, 2, 3, 4, 5] y = [2, 3, 5, 7, 11] # scatter(), 散点图. plt.scatter(x, y, color='red') # 绘制红色散点图 plt.title("Simple Scatter Plot") # 设置图表标题 plt.xlabel("X-axis") # 设置X轴标签 plt.ylabel("Y-axis") # 设置Y轴标签 plt.show() # 显示图表【上一篇】【数据处理与统计分析】8.Pandas高级处理:缺失值判断&数据合并
【下一篇】【数据处理与统计分析】10.RFM会员价值度模型案例