一、Matplotlib快速入门目标了解什么是matplotlib为什么要学习matplotlibmatplotlib简单图形的绘制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), dpi80) # 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), dpi80) # 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 [f11点{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 *步骤四修改配置文件matplotlibrcvi ~/.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--, alpha0.5)设置标签:plt.xlabel(x轴标签)plt.ylabel(y轴标签)plt.title(标题, fontsize20) #fontsize 文字大小#完善上面代码 # 4.2 添加网格. # 参1: 网格线是否显示. True - 显示, False - 不显示. # 参2: linestyle: 网格线类型, - - 实线, -- - 虚线, : - 点线, -. - 虚点线 # 参3: 透明度. plt.grid(True, linestyle-, alpha0.5) # 4.3 设置标题 和 x, y轴的 标签. plt.xlabel(时间, fontsize15) plt.ylabel(温度, fontsize20) plt.title(成都市11点到12点1小时的温度变化, fontsize20)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), dpi80) # 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 [f11点{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-, alpha0.5) # 4.3 设置标题 和 x, y轴的 标签. plt.xlabel(时间, fontsize15) plt.ylabel(温度, fontsize20) plt.title(成都市11点到12点1小时的温度变化, fontsize20) # 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成都, colorr) # label - 图例标签 显示的值, color - 颜色 # 4.2 添加网格. # 参1: 网格线是否显示. True - 显示, False - 不显示. # 参2: linestyle: 网格线类型, - - 实线, -- - 虚线, : - 点线, -. - 虚点线 # 参3: 透明度. plt.grid(True, linestyle--, alpha0.5)颜色字符风格字符r 红色- 实线g 绿色- - 虚线b 蓝色-. 点划线w 白色: 点虚线c 青色 留空、空格m 洋红y 黄色k 黑色显示图例:注意如果只在plt.plot()中设置label还不能最终显示出图例还需要通过plt.legend()将图例显示出来,eg:# 4.4 显示图例. # 参1: 图例标签, 参2: 图例的位置. # plt.legend([成都, 黑龙江], locbest) # Location Code - 图例的位置的值. # 参2: 绘图时如果指定了图例值, 则图例标签可以省略. plt.legend(loc1) # loc: 图例显示位置 plt.legend(locbest) # 效果同上.legend里面的loc参数参考值如下:Location StringLocation Codebest0upper right1upper left2lower left3lower right4right5center left6center right7lower center8upper center9center10完整代码:# 需求: 画出成都, 黑龙江, 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), dpi80) # 3. 绘制图形. plt.plot(x, y_cd, label成都, colorr) # label - 图例标签 显示的值, color - 颜色 plt.plot(x, y_hlj, label黑龙江, colorb) # 4. 给图标添加辅助功能. # 4.1 添加自定义x,y刻度 x_ticks_label [f11点{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--, alpha0.5) # 4.3 设置标题 和 x, y轴的 标签. plt.xlabel(时间, fontsize15) plt.ylabel(温度, fontsize15) plt.title(成功/黑龙江 11点到12点1小时的温度变化, fontsize20) # 4.4 显示图例. # 参1: 图例标签, 参2: 图例的位置. # plt.legend([成都, 黑龙江], locbest) # Location Code - 图例的位置的值. # 参2: 绘图时如果指定了图例值, 则图例标签可以省略. plt.legend(loc1) # loc: 图例显示位置 plt.legend(locbest) # 效果同上. # 5. 保存图形, 细节: plt.show()之后会释放画布资源, 所以要在 plt.show()之前调用, 用于保存图片, 否则图片就是空白的. plt.savefig(./my2.jpg) # 6.显示图形. plt.show()效果图如下:3.多个坐标系显示— plt.subplots(面向对象的画图方法)如果想要将成都和重庆的天气图显示在同一个图的不同坐标系当中效果如下:可以通过subplots函数实现(旧的版本中有subplot使用起来不方便)推荐subplots函数:matplotlib.pyplot.subplots(nrows1, ncols1, **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), dpi80) # 面向过程版, 即: 所有的函数都是 plt. 的方式调用的. # 面向对象版绘图, fig - 画布(1行2列的画布), ax - 坐标系 plg, ax plt.subplots(figsize(20, 8), nrows1, ncols2) # 3. 具体的绘制图像的动作.color: 线的颜色, label: 标签名称, linstyle: 线的格式 # ax[0] - 坐标系的0行0列 ax[0].plot(x, y_cd, colorr, label成都) # ax[1] - 坐标系的0行1列 ax[1].plot(x, y_hlj, colory, label黑龙江, linestyle--) # 4. 添加刻度 # 4.1 定义变量, 表示: x轴, y轴刻度的范围. x_ticks_label [f11点{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(温度, fontsize15) ax[0].set_ylabel(湿度, fontsize15) ax[0].set_title(成都11点到12点1小时的温度变化, fontsize20) ax[1].set_xlabel(温度, fontsize15) ax[1].set_ylabel(湿度, fontsize15) ax[1].set_title(重庆11点到12点1小时的温度变化, fontsize20) # 6. 添加网格. # 参1: 网格线是否显示. True - 显示, False - 不显示. # 参2: linestyle: 网格线类型, - - 实线, -- - 虚线, : - 点线, -. - 虚点线 # 参3: 透明度. ax[0].grid(True, linestyle--, alpha0.5) ax[1].grid(True, linestyle-., alpha0.5) # 7. 添加图例. ax[0].legend(locbest) ax[1].legend(loc0) # 效果同上, 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), dpi90) # 2.绘制函数图像 plt.plot(x, y) # 2.1 添加网格显示 plt.grid() # 3.显示图像 plt.show()应用场景:呈现公司产品(不同区域)每天活跃用户数呈现app每天下载数量呈现产品新功能上线后,用户点击次数随时间的变化拓展画各种数学函数图像注意plt.plot()除了可以画折线图也可以用于画各种数学函数图像三、常见图形绘制1、官方案例库https://matplotlib.org/stable/gallery/index.html2、常见图形种类及意义常见图形绘制如下:折线图( plot() ), 柱状图( bar() ), 直方图( hist() ) 饼图( pie() ), 散点图( scatter() )......Matplotlib官方绘图网址 参考:https://matplotlib.org/stable/gallery/index.html2.1 折线图折线图以折线的上升或下降来表示统计数量的增减变化的统计图特点能够显示数据的变化趋势反映事物的变化情况。(变化)apiplt.plot(x, y)2.2 柱形图柱状图排列在工作表的列或行中的数据可以绘制到柱状图中。特点绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)apiplt.bar(x, width, aligncenter, **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, colorr) # 3. 设置x轴, y轴标签 和 标题. plt.xlabel(分类名) plt.ylabel(商品个数) plt.title(商品分类统计图, fontsize15) # 4. 显示图像. plt.show()2.3 直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围纵轴表示分布情况。特点绘制连续性的数据展示一组或者多组数据的分布状况(统计)apimatplotlib.pyplot.hist(x, binsNone)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, bins10, colorb, alpha0.5, rwidth0.85) # 4. 设置 x轴, y轴标签 和 标题. plt.xlabel(商品价格区间) plt.ylabel(商品个数) plt.title(商品价格区间分布图, fontsize15) # 5. 显示图形. plt.show()2.4 饼图饼图用于表示不同分类的占比情况通过弧度大小来对比各种分类。特点分类数据的占比情况(占比)apiplt.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, labelslabels, autopct%1.1f%%) # 绘制饼图显示百分比 plt.title(Simple Pie Chart) # 设置图表标题 # 3. 显示图形. plt.show() # 显示图表2.5 散点图散点图用两组数据构成多个坐标点考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。特点判断变量之间是否存在数量关联趋势,展示离群点(分布规律)apiplt.scatter(x, y)# 散点图, 适用于 散点分析, 即: 两个值之间的关系. x [1, 2, 3, 4, 5] y [2, 3, 5, 7, 11] # scatter(), 散点图. plt.scatter(x, y, colorred) # 绘制红色散点图 plt.title(Simple Scatter Plot) # 设置图表标题 plt.xlabel(X-axis) # 设置X轴标签 plt.ylabel(Y-axis) # 设置Y轴标签 plt.show() # 显示图表【上一篇】【数据处理与统计分析】8.Pandas高级处理:缺失值判断数据合并【下一篇】【数据处理与统计分析】10.RFM会员价值度模型案例