网站优化专家,dede织梦网站,建网站比较好,教育政务网站建设Matplotlib是一款免费开源的Python数据可视化工具。
Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一#xff0c;支持跨平台运行#xff0c;它是 Python 常用的 2D 绘图库#xff0c;同时它也提供了一部分 3D 绘图接口。Matplotlib 通常与 NumPy、Pandas 一起使用支持跨平台运行它是 Python 常用的 2D 绘图库同时它也提供了一部分 3D 绘图接口。Matplotlib 通常与 NumPy、Pandas 一起使用是数据分析中不可或缺的重要工具之一。 Matplotlib 是 Python 中类似 MATLAB 的绘图工具如果您熟悉 MATLAB那么可以很快的熟悉它。Matplotlib 提供了一套面向对象绘图的 API它可以轻松地配合 Python GUI 工具包比如 PyQtWxPython、Tkinter在应用程序中嵌入图形。与此同时它也支持以脚本的形式在 Python、IPython Shell、Jupyter Notebook 以及 Web 应用的服务器中使用。
教程特点
本套教程适合 Matplotlib 的初学者学习在学习完本教程后您将掌握 Matplotlib 的种绘图方法并对数据可视化这一概念有一个全新的认识。 本套教程从 Matplotlib 基础知识入手手把手教你如何使用matplotlib.pyplot模块绘制各种图形比如柱状图、饼状图、折线图等。教程中介绍了与 Matplotlib 绘图相关的图形对象、轴域对象、坐标轴设置等知识通过学习这些知识您将全面掌握如何 Matplotlib 的绘图方法。本套教程中使用了大量的绘图实例通过实例与知识相结合的方式让学习 Matplotlib 绘图变的轻松、有趣。
阅读条件
Matplotlib 是用 Python 语言编写的并且能够与 Python 的科学计算库 NumPy 搭配使用。因此在阅读本教程前你应该掌握 Python 的基础知识并且对 NumPy 库有一定程度的了解在您学习本套教程时这些知识对您大有裨益。
一、数据可视化是什么
如果将文本数据与图表数据相比较人类的思维模式更适合于理解后者原因在于图表数据更加直观且形象化它对于人类视觉的冲击更强这种使用图表来表示数据的方法被叫做数据可视化。 图1数据可视化
当使用图表来表示数据时我们可以更有效地分析数据并根据分析做出相应的决策。在学习 Matplotlib 之前了解什么是数据可视化是非常有必要的。
1、数据可视化
图表为更好地探索、分析数据提供了一种直观的方法它对最终分析结果的展示具有重要的作用。
数据可视化是一个新兴名词它表示用图表的形式对数据进行展示。当您对一个数据集进行分析时如果使用数据可视化的方式那么您会很容易地确定数据集的分类模式、缺失数据、离群值等等。下图展示了五个常用的数据可视化图表 图2数据可视化常用图表
对于组织决策者而言数据可视化也只是一种辅助工具从寻找数据间关联到最终做出决定大致分为以下四步。如下图所示 图3组织者决策流程图
下面对图 3 中的流程进行简要说明
可视化Visualize使用不同种类的图表对原始数据进行可视化处理使复杂的数据更容易理解与使用分析Analysis数据分析的目的是获取有用的信息这个过程主要涉及对数据的清洗、检查、转换以及对数据的建模文档说明Document insight文档说明属于整理、汇总阶段将有用的数据或者信息整理出来数据集转换Transform Data Set指将数据进行分类、分级、统计记录格式与编码格式等。
2、数据可视化应用场景
数据可视化主要有以下应用场景
企业领域利用直观多样的图表展示数据从而为企业决策提供支持股票走势预测通过对股票涨跌数据的分析给股民提供更合理化的建议商超产品销售对客户群体和所购买产品进行数据分析促使商超制定更好的销售策略预测销量对产品销量的影响因素进行分析可以预测出产品的销量走势。
其实不管是在日常生活还是工作中我们都会根据过往的经验作出某些决定这种做法也叫做“经验之谈”。数据分析和其类似通过对过往数据的大量分析从而对数据的未来走势做出预测。
二、Matplotlib是什么
Matplotlib 是一款用于数据可视化的 Python 软件包支持跨平台运行它能够根据 NumPy ndarray 数组来绘制 2D 图像它使用简单、代码清晰易懂深受广大技术爱好者喜爱。 NumPy 是 Python 科学计算的软件包ndarray 则是 NumPy 提供的一种数组结构。 Matplotlib 由 John D. Hunter 在 2002 年开始编写 2003 年 Matplotlib 发布了第一个版本并加入了 BSD 开源软件组织。Matplotlib 1.4 是最后一个支持 Python 2 的版本它的最新版本 3.1.1 已于 2019 年 7 月 1 日发布。 图1Matplotlib 图标
Matplotlib 提供了一个套面向绘图对象编程的 API 接口能够很轻松地实现各种图像的绘制并且它可以配合 Python GUI 工具如 PyQt、Tkinter 等在应用程序中嵌入图形。同时 Matplotlib 也支持以脚本的形式嵌入到 IPython shell、Jupyter 笔记本、web 应用服务器中使用。
1、Matplotlib架构组成
Matplotlib 由三个不同的层次结构组成分别是脚本层、美工层和后端层。 图2Matplotlib架构图
1 脚本层
脚本层是 Matplotlib 结构中的最顶层。我们编写的绘图代码大部分代码都在该层运行它的主要工作是负责生成图形与坐标系。
2 美工层
美工层是结构中的第二层它提供了绘制图形的元素时的给各种功能例如绘制标题、轴标签、坐标刻度等。
3 后端层
后端层是 Matplotlib 最底层它定义了三个基本类首先是 FigureCanvas图层画布类它提供了绘图所需的画布其次是 Renderer绘图操作类它提供了在画布上进行绘图的各种方法最后是 Event事件处理类它提供了用来处理鼠标和键盘事件的方法。
2、Matplotlib图形组成
Matplotlib 生成的图形主要由以下几个部分构成 图3Matplotlib图像组成 Figure指整个图形您可以把它理解成一张画布它包括了所有的元素比如标题、轴线等Axes绘制 2D 图像的实际区域也称为轴域区或者绘图区Axis指坐标系中的垂直轴与水平轴包含轴的长度大小图中轴长为 7、轴标签指 x 轴y轴和刻度标签Artist您在画布上看到的所有元素都属于 Artist 对象比如文本对象title、xlabel、ylabel、Line2D 对象用于绘制2D图像等。
3、Matplotlib功能扩展包
许多第三方工具包都对 Matplotlib 进行了功能扩展其中有些安装包需要单独安装也有一些允许与 Matplotlib 一起安装。常见的工具包如下
Basemap这是一个地图绘制工具包其中包含多个地图投影海岸线和国界线Cartopy这是一个映射库包含面向对象的映射投影定义以及任意点、线、面的图像转换能力Excel tools 这是 Matplotlib 为了实现与 Microsoft Excel 交换数据而提供的工具Mplot3d它用于 3D 绘图Natgrid这是 Natgrid 库的接口用于对间隔数据进行不规则的网格化处理。
三、Matplotlib下载和安装
Matplotlib 是 Python 的第三方绘图库它非常类似于 MATLAB。在使用 Matplotlib 软件包之前需要对其进行安装。本节以 Windows10 系统为例介绍 Matplotlib 的几种安装方式。 MATLAB 是一款商业软件主要用于数据分析、图像处理、计算机视觉等领域。 1、使用pip理器安装
使用 Python 包管理器 pip 来安装 Matplotlib 是一种最轻量级的方式。打开 CMD 命令提示符窗口并输入以下命令
pip install matplotlib 图1pip安装Matplotlib
2、使用Anaconda安装
安装 Matplotlib 的最好的方法是下载 Python 的 Anaconda 发行版因为 Matplotlib 被预先安装在 Anaconda 中。安装方法如下 Anaconda 是一个开源的 Python 发行版本其包含了 Python、NumPy、Matplotlib 等180多个科学包及其依赖项。 1) 访问 Anaconda 的官方网站点击前往然后单击“Download”按钮如下图所示 图2Anaconda官网
2) 根据您的 Python 解释器版本选择相应的 Anaconda 版本下载。 图3Anacona下载
Anconda 中提供了一个交互式笔记本 Jupyter您可以把它理解为 IPython 的升级本它拥有比 IPython 更强大的功能方便您对程序代码的实时调试。 Jupyter 的本质上是一个 Web 应用程序它支持运行 40 多种编程语言主要应用于数据可视化、数值模拟、统计建模以及机器学习等。 当您成功安装 Anaconda 后您可以通过系统的开始菜单找到 Jupyter然后启动它Jupyter 界面如下所示 图4Jupyter交互式笔记本
Jupyter 使用方法简单在本教程不做具体介绍可以参见官网《Jupyter Notbook使用介绍》。
3、验证安装
要验证 Matplotlib 是否成功安装可以在命令提示符窗口执行以下命令
import matplotlib
matplotlib.__version__
3.1.1
四、Matplotlib.pyplot接口汇总 Matplotlib 中的 pyplot 模块是一个类似命令风格的函数集合这使得 Matplotlib 的工作模式和 MATLAB 相似。 pyplot 模块提供了可以用来绘图的各种函数比如创建一个画布在画布中创建一个绘图区域或是在绘图区域添加一些线、标签等。以下表格对这些函数做了简单地介绍。
1、绘图类型 绘图类型 函数名称描述Bar绘制条形图Barh绘制水平条形图Boxplot绘制箱型图Hist绘制直方图his2d绘制2D直方图Pie绘制饼状图Plot在坐标轴上画线或者标记Polar绘制极坐标图Scatter绘制x与y的散点图Stackplot绘制堆叠图Stem用来绘制二维离散数据绘制又称为“火柴图”Step绘制阶梯图Quiver绘制一个二维按箭头
2、Image函数 图像函数 函数名称描述Imread从文件中读取图像的数据并形成数组。Imsave将数组另存为图像文件。Imshow在数轴区域内显示图像。
3、Axis函数 Axis函数 函数名称描述Axes在画布(Figure)中添加轴Text向轴添加文本Title设置当前轴的标题Xlabel设置x轴标签Xlim获取或者设置x轴区间大小Xscale设置x轴缩放比例Xticks获取或设置x轴刻标和相应标签Ylabel设置y轴的标签Ylim获取或设置y轴的区间大小Yscale设置y轴的缩放比例Yticks获取或设置y轴的刻标和相应标签
4、Figure函数 Figure函数 函数名称描述Figtext在画布上添加文本Figure创建一个新画布Show显示数字Savefig保存当前画布Close关闭画布窗口
五、 第一个Matplotlib绘图程序
本节学习第一个 Matplotlib 绘图程序如何使用 Matplotlib 绘制一个简单的折线图。下面绘制一个简单正弦曲线图它显示了角度与正弦函数值之间的关系。
第一个绘图程序
首先导入 Matplotlib 包中的 Pyplot 模块并以 as 别名的形式简化引入包的名称。
import matplotlib.pyplot as plt
接下来使用 NumPy 提供的函数 arange() 创建一组数据来绘制图像。
#引入numpy包
import numpy as np
#获得0到2π之间的ndarray对象
x np.arange(0, math.pi*2, 0.05)
上述所得 x 的值作用到 x 轴上而该值对应的正弦值也就是 y 值使用以下方法获取
y np.sin(x)
使用 plot() 函数对 x、y 进行绘制。
plt.plot(x,y)
主要的绘图工作已经完成不过还需要绘制一些细节需要我们补充一下比如图像的标题(title)、x 轴与 y 轴的标签label等。
plt.xlabel(angle)
plt.ylabel(sine)
plt.title(sine wave)
完整的程序代码如下
from matplotlib import pyplot as plt
import numpy as np
import math
#调用math.pi方法弧度转为角度
x np.arange(0, math.pi*2, 0.05)
y np.sin(x)
plt.plot(x,y)
plt.xlabel(angle)
plt.ylabel(sine)
plt.title(sine wave)
#使用show展示图像
plt.show()
代码执行后显示结果如下 图1sine正弦函数图像
您也可以在 Jupyter 笔记本中运行 Matplotlib 的绘图程序。通过命令行或者开始菜单的方式启动 Jupyter 笔记本。启动成功后将上述代码拷贝到输入行内如下所示 图2Jupyter交互式笔记本 注意%matplotlib inline 是 Jupyter 提供的魔法命令它可以把输出图显示在笔记本内部否则会以查看器的形式单独显示。 六、PyLab绘制曲线图
PyLab 是一个面向 Matplotlib 的绘图库接口其语法和 MATLAB 十分相近。它和 Pyplot 模快都够实现 Matplotlib 的绘图功能。PyLab 是一个单独的模块随 Matplotlib 软件包一起安装该模块的导包方式和 Pyplot 不同如下所示
#Pyplot导包方式
from matplotlib import pyplot as plt
#PyLab导包有两种方式
import pylab
from pylab import *
PyLab 是一个很便捷的模块下面对它的使用方法做相应的介绍。
基本绘图
提供一对相同长度的数组或序列然后使用plot()绘制曲线示例如下
from numpy import *
from pylab import *
x linspace(-3, 3, 30)
y x**2
plot(x, y)
show()
输出结果 图1绘制曲线图
如果您要绘制特殊类型的线条并想添加一些颜色PyLab 提供了如下方法
符号----.:.,o^vsxDd1234hHp| _颜色b(蓝色)g(绿色)r(红色)c(青色)m(品红)y(黄色)k(黑色)w(白色)
使用示例如下
from pylab import *
x linspace(-3, 3, 30)
y x**2
plot(x, y, r.)
show()
输出结果 图2红点曲线图
如果您想在同一绘图区域内绘制多个图形只需要使用多个绘图命令。示例如下
from pylab import *
plot(x, sin(x))
plot(x, cos(x), r-)
plot(x, -sin(x), g--)
show()
输出结果 图3绘制多条不同曲线 如果您想清除图像直接在程序末尾调用 clf() 方法即可。 七、Matplotlib figure图形对象
通过前面的学习我们知道matplotlib.pyplot模块能够快速地生成图像但如果使用面向对象的编程思想我们就可以更好地控制和自定义图像。
在 Matplotlib 中面向对象编程的核心思想是创建图形对象figure object。通过图形对象来调用其它的方法和属性这样有助于我们更好地处理多个画布。在这个过程中pyplot 负责生成图形对象并通过该对象来添加一个或多个 axes 对象即绘图区域。 Matplotlib 提供了matplotlib.figure图形类模块它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。如下所示
from matplotlib import pyplot as plt
#创建图形对象
fig plt.figure()
该函数的参数值如下所示
参数说明figsize指定画布的大小(宽度,高度)单位为英寸。dpi指定绘图对象的分辨率即每英寸多少个像素默认值为80。facecolor背景颜色。dgecolor边框颜色。frameon是否显示边框。
下面使用 figure() 创建一个空白画布
fig plt.figure()
我们使用 add_axes() 将 axes 轴域添加到画布中。如下所示
axfig.add_axes([0,0,1,1])
add_axes() 的参数值是一个序列序列中的 4 个数字分别对应图形的左侧底部宽度和高度且每个数字必须介于 0 到 1 之间。 设置 x 和 y 轴的标签以及标题如下所示
ax.set_title(sine wave)
ax.set_xlabel(angle)
ax.set_ylabel(sine)
调用 axes 对象的 plot() 方法对 x 、 y 数组进行绘图操作
ax.plot(x,y)
完整的代码如下所示
from matplotlib import pyplot as plt
import numpy as np
import math
x np.arange(0, math.pi*2, 0.05)
y np.sin(x)
fig plt.figure()
ax fig.add_axes([0,0,1,1])
ax.plot(x,y)
ax.set_title(sine wave)
ax.set_xlabel(angle)
ax.set_ylabel(sine)
plt.show()
输出结果如下 图1运行结果图
在 Jupyter Notebook 中运行程序结果如下 图2运行结果
八、Matplotlib axes类使用详解
Matplotlib 定义了一个 axes 类轴域类该类的对象被称为 axes 对象即轴域对象它指定了一个有数值范围限制的绘图区域。在一个给定的画布figure中可以包含多个 axes 对象但是同一个 axes 对象只能在一个画布中使用。 2D 绘图区域axes包含两个轴axis对象如果是 3D 绘图区域则包含三个。 通过调用 add_axes() 方法能够将 axes 对象添加到画布中该方法用来生成一个 axes 轴域对象对象的位置由参数rect决定。 rect 是位置参数接受一个由 4 个元素组成的浮点数列表形如 [left, bottom, width, height] 它表示添加到画布中的矩形区域的左下角坐标(x, y)以及宽度和高度。如下所示
axfig.add_axes([0.1,0.1,0.8,0.8])
注意每个元素的值是画布宽度和高度的分数。即将画布的宽、高作为 1 个单位。比如[ 0.1, 0.1, 0.8, 0.8]它代表着从画布 10% 的位置开始绘制, 宽高是画布的 80%。 下面介绍 axes 类的其他成员函数这些函数在绘图过程中都承担着不同的作用。
1、legend()绘制图例
axes 类的 legend() 方法负责绘制画布中的图例它需要三个参数如下所示
ax.legend(handles, labels, loc)
labels 是一个字符串序列用来指定标签的名称loc 是指定图例位置的参数其参数值可以用字符串或整数来表示handles 参数它也是一个序列它包含了所有线型的实例
下面是 loc 参数的表示方法分为字符串和整数两种如下所示
位置字符串表示整数数字表示自适应Best0右上方upper right1左上方upper left2左下lower left3右下lower right4右侧right5居中靠左center left6居中靠右center right7底部居中lower center8上部居中upper center9中部center10
2、axes.plot()
这是 axes 类的基本方法它将一个数组的值与另一个数组的值绘制成线或标记plot() 方法具有可选格式的字符串参数用来指定线型、标记颜色、样式以及大小。 颜色代码如下表
b蓝色g绿色r红色c青色m品红色y黄色k黑色w白色
标记符号如下表
标记符号描述.点标记o圆圈标记xX标记D钻石标记H六角标记s正方形标记加号标记
线型表示字符如下表
字符描述-实线--虚线-.点划线:虚线H六角标记
下面的例子以直线图的形式展示了电视、智能手机广告费与其所带来产品销量的关系图。其中描述电视的是带有黄色和方形标记的实线而代表智能手机的则是绿色和圆形标记的虚线。
import matplotlib.pyplot as plt
y [1, 4, 9, 16, 25,36,49, 64]
x1 [1, 16, 30, 42,55, 68, 77,88]
x2 [1,6,12,18,28, 40, 52, 65]
fig plt.figure()
ax fig.add_axes([0,0,1,1])
#使用简写的形式color/标记符/线型
l1 ax.plot(x1,y,ys-)
l2 ax.plot(x2,y,go--)
ax.legend(labels (tv, Smartphone), loc lower right) # legend placed at lower right
ax.set_title(Advertisement effect on sales)
ax.set_xlabel(medium)
ax.set_ylabel(sales)
plt.show()
输出结果如下 图1输出结果
九、Matplotlib subplot()函数用法详解
在使用 Matplotlib 绘图时我们大多数情况下需要将一张画布划分为若干个子区域之后我们就可以在这些区域上绘制不用的图形。在本节我们将学习如何在同一画布上绘制多个子图。matplotlib.pyplot模块提供了一个 subplot() 函数它可以均等地划分画布该函数的参数格式如下
plt.subplot(nrows, ncols, index)
nrows 与 ncols 表示要划分几行几列的子区域nrows*nclos表示子图数量index 的初始值为1用来选定具体的某个子区域。 例如 subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域如下图所示同时选择在第 3 个位置绘制子图。 图1示意图
如果新建的子图与现有的子图重叠那么重叠部分的子图将会被自动删除因为它们不可以共享绘图区域。
import matplotlib.pyplot as plt
plt.plot([1,2,3])
#现在创建一个子图它表示一个有2行1列的网格的顶部图。
#因为这个子图将与第一个重叠所以之前创建的图将被删除
plt.subplot(211)
plt.plot(range(12))
#创建带有黄色背景的第二个子图
plt.subplot(212, facecolory)
plt.plot(range(12))
上述代码运行结果如下图所示 图2subplot绘制结果
如果不想覆盖之前的图需要使用 add_subplot() 函数代码如下
import matplotlib.pyplot as plt
fig plt.figure()
ax1 fig.add_subplot(111)
ax1.plot([1,2,3])
ax2 fig.add_subplot(221, facecolory)
ax2.plot([1,2,3])
执行上述代码输出结果如下 图3add_subplot()绘图结果
通过给画布添加 axes 对象可以实现在同一画布中插入另外的图像。
import matplotlib.pyplot as plt
import numpy as np
import math
x np.arange(0, math.pi*2, 0.05)
figplt.figure()
axes1 fig.add_axes([0.1, 0.1, 0.8, 0.8]) # main axes
axes2 fig.add_axes([0.55, 0.55, 0.3, 0.3]) # inset axes
y np.sin(x)
axes1.plot(x, y, b)
axes2.plot(x,np.cos(x),r)
axes1.set_title(sine)
axes2.set_title(cosine)
plt.show()
输出结果如下 图4输出结果图
十、Matplotlib subplots()函数详解
matplotlib.pyplot模块提供了一个 subplots() 函数它的使用方法和 subplot() 函数类似。其不同之处在于subplots() 既创建了一个包含子图区域的画布又创建了一个 figure 图形对象而 subplot() 只是创建一个包含子图区域的画布。 subplots 的函数格式如下
fig , ax plt.subplots(nrows, ncols)
nrows 与 ncols 表示两个整数参数它们指定子图所占的行数、列数。 函数的返回值是一个元组包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols且每个 axes 对象均可通过索引值访问从1开始。 下面我们创建了一个 2 行 2 列的子图并在每个子图中显示 4 个不同的图像。
import matplotlib.pyplot as plt
fig,a plt.subplots(2,2)
import numpy as np
x np.arange(1,5)
#绘制平方函数
a[0][0].plot(x,x*x)
a[0][0].set_title(square)
#绘制平方根图像
a[0][1].plot(x,np.sqrt(x))
a[0][1].set_title(square root)
#绘制指数函数
a[1][0].plot(x,np.exp(x))
a[1][0].set_title(exp)
#绘制对数函数
a[1][1].plot(x,np.log10(x))
a[1][1].set_title(log)
plt.show()
上述代码的输出结果如下 图1:输出结果
十一、Matplotlib subplot2grid()函数详解
matplotlib.pyplot 模块提供了 subplot2grid() 该函数能够在画布的特定位置创建 axes 对象即绘图区域。不仅如此它还可以使用不同数量的行、列来创建跨度不同的绘图区域。与 subplot() 和 subplots() 函数不同subplot2gird() 函数以非等分的形式对画布进行切分并按照绘图区域的大小来展示最终绘图结果。 函数语法格式如下
plt.subplot2grid(shape, location, rowspan, colspan)
参数含义如下
shape把该参数值规定的网格区域作为绘图区域location在给定的位置绘制图形初始位置 (0,0) 表示第1行第1列rowsapan/colspan这两个参数用来设置让子区跨越几行几列。
下面在画布figure中添加了行、列跨度均不相同的绘图子区域然后在每个绘图区上绘制不同的图形。示例代码如下
import matplotlib.pyplot as plt
#使用 colspan指定列使用rowspan指定行
a1 plt.subplot2grid((3,3),(0,0),colspan 2)
a2 plt.subplot2grid((3,3),(0,2), rowspan 3)
a3 plt.subplot2grid((3,3),(1,0),rowspan 2, colspan 2)
import numpy as np
x np.arange(1,10)
a2.plot(x, x*x)
a2.set_title(square)
a1.plot(x, np.exp(x))
a1.set_title(exp)
a3.plot(x, np.log(x))
a3.set_title(log)
plt.tight_layout()
plt.show()
网格区域为3*3大小a1位置为第一行第一列跨越两列大小a2位置为第一行第三列占三行大小a3位置为第二行第一列占两行、两列大小。
输出结果如下 图1subplot2grid()输出结果
十二、Matplotlib grid()设置网格格式
通过 Matplotlib axes 对象提供的 grid() 方法可以开启或者关闭画布中的网格即是否显示网格以及网格的主/次刻度。除此之外grid() 函数还可以设置网格的颜色、线型以及线宽等属性。 grid() 的函数使用格式如下
grid(colorb, ls -., lw 0.25)
参数含义如下
color表示网格线的颜色ls表示网格线的样式lw表示网格线的宽度
网格在默认状态下是关闭的通过调用上述函数网格会被自动开启如果您只是想开启不带任何样式的网格可以通过 grid(True) 来实现。 实例如下
import matplotlib.pyplot as plt
import numpy as np
#fig画布axes子图区域
fig, axes plt.subplots(1,3, figsize (12,4))
x np.arange(1,11)
axes[0].plot(x, x**3, g,lw2)
#开启网格
axes[0].grid(True)
axes[0].set_title(default grid)
axes[1].plot(x, np.exp(x), r)
#设置网格的颜色线型线宽
axes[1].grid(colorb, ls -., lw 0.25)
axes[1].set_title(custom grid)
axes[2].plot(x,x)
axes[2].set_title(no grid)
fig.tight_layout()
plt.show()
上述代码执行后输出结果 图1输出结果
十三、Matplotlib坐标轴格式
在一个函数图像中有时自变量 x 与因变量 y 是指数对应关系这时需要将坐标轴刻度设置为对数刻度。Matplotlib 通过 axes 对象的xscale或yscale属性来实现对坐标轴的格式设置。 示例右侧的子图显示对数刻度左侧子图则显示标量刻度。
import matplotlib.pyplot as plt
import numpy as np
fig, axes plt.subplots(1, 2, figsize(10,4))
x np.arange(1,5)
axes[0].plot( x, np.exp(x))
axes[0].plot(x,x**2)
axes[0].set_title(Normal scale)
axes[1].plot (x, np.exp(x))
axes[1].plot(x, x**2)
#设置y轴
axes[1].set_yscale(log)
axes[1].set_title(Logarithmic scale (y))
axes[0].set_xlabel(x axis)
axes[0].set_ylabel(y axis)
axes[0].xaxis.labelpad 10
#设置x、y轴标签
axes[1].set_xlabel(x axis)
axes[1].set_ylabel(y axis)
plt.show() 图1对数关系图
轴是连接刻度的线也就是绘图区域的边界在绘图区域axes 对象的顶部、底部、左侧和右侧都有一个边界线轴。通过指定轴的颜色和宽度从而对进行显示格式设置比如将所有轴的颜色设置为 None那么它们都会成为隐藏状态或者也可以给轴添加相应的颜色。以下示例为左侧轴、底部轴分别设置了红色、蓝色如下所示
import matplotlib.pyplot as plt
fig plt.figure()
ax fig.add_axes([0,0,1,1])
#为左侧轴底部轴添加颜色
ax.spines[bottom].set_color(blue)
ax.spines[left].set_color(red)
ax.spines[left].set_linewidth(2)
#将侧轴、顶部轴设置为None
ax.spines[right].set_color(None)
ax.spines[top].set_color(None)
ax.plot([1,2,3,4,5])
plt.show()
输出结果如下 图2输出结果
十四、Matplotlib坐标轴范围
Matplotlib 可以根据自变量与因变量的取值范围自动设置 x 轴与 y 轴的数值大小。当然您也可以用自定义的方式通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。 当对 3D 图像进行设置的时会增加一个 z 轴此时使用 set_zlim() 可以对 z 轴进行设置。 下面示例分别对自动设置和自定义设置做了演示第一种 Matplotlib 自动设置。
import matplotlib.pyplot as plt
import numpy as np
fig plt.figure()
#添加绘图区域
a1 fig.add_axes([0,0,1,1])
#准备数据
x np.arange(1,10)
#绘制函数图像
a1.plot(x, np.exp(x))
#添加题目
a1.set_title(exp)
plt.show()
代码执行后输出结果如下 图1输出结果
第二种自定义设置set_xlim() 将 x 轴的数值范围设置为0到10) set_ylim() 将 y 轴的范围设置为0到10000。
import matplotlib.pyplot as plt
fig plt.figure()
a1 fig.add_axes([0,0,1,1])
import numpy as np
x np.arange(1,10)
a1.plot(x, np.exp(x),r)
a1.set_title(exp)
#设置y轴
a1.set_ylim(0,10000)
#设置x轴
a1.set_xlim(0,10)
plt.show()
输出结果如下 图2输出结果
十五、Matplotlib刻度和刻度标签
刻度指的是轴上数据点的标记Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器两个内建类。在大多数情况下这两个内建类完全能够满足我们的绘图需求但是在某些情况下刻度标签或刻度也需要满足特定的要求比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”此时就需要对它们重新设置。 xticks() 和 yticks() 函数接受一个列表对象作为参数列表中的元素表示对应数轴上要显示的刻度。如下所示
ax.set_xticks([2,4,6,8,10])
x 轴上的刻度标记依次为 246810。您也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。 下面示例对刻度和标签的使用方法做了说明。
import matplotlib.pyplot as plt
import numpy as np
import math
x np.arange(0, math.pi*2, 0.05)
#生成画布对象
fig plt.figure()
#添加绘图区域
ax fig.add_axes([0.1, 0.1, 0.8, 0.8])
y np.sin(x)
ax.plot(x, y)
#设置x轴标签
ax.set_xlabel(angle)
ax.set_title(sine)
ax.set_xticks([0,2,4,6])
#设置x轴刻度标签
ax.set_xticklabels([zero,two,four,six])
#设置y轴刻度
ax.set_yticks([-1,0,1])
plt.show()
输出结果如下 图1绘制坐标轴刻度与标签
十六、Matplotlib中文乱码解决方案两种方式
Matplotlib 默认不支持中文字体这因为 Matplotlib 只支持 ASCII 字符但中文标注更加符合中国人的阅读习惯。因此本节重点讲解如何在 Windows 环境下让 Matplotlib 显示中文。
1、Matplotlib中文乱码
当不对 Matplotlib 进行设置而直接使用中文时绘制的图像会出现中文乱码。下面是一个含有中文乱码的折线图 从上图可以看出本应该显示在红框内的中文字体没有显示出来红框是自己标注出来的下面给出了两种解决方案第一种是临时解决方案第二种是一劳永逸的解决方案。
2、重写配置文件
通过临时重写配置文件的方法可以解决 Matplotlib 显示中文乱码的问题代码如下所示
import matplotlib.pyplot as plt
plt.rcParams[font.sans-serif][SimHei] #设置字体
plt.rcParams[axes.unicode_minus]False #该语句解决图像中的“-”负号的乱码问题
将上述代码添加到您的绘图程序中即可解决中文乱码的问题。这是一种非常灵活、便捷的解决方法。完整的程序代码如下
#绘制折线图
import matplotlib.pyplot as plt
plt.rcParams[font.sans-serif][SimHei] #设置字体
plt.rcParams[axes.unicode_minus]False #正常显示负号
year [2017, 2018, 2019, 2020]
people [20, 40, 60, 70]
#生成图表
plt.plot(year, people)
plt.xlabel(年份)
plt.ylabel(人口)
plt.title(人口增长)
#设置纵坐标刻度
plt.yticks([0, 20, 40, 60, 80])
#设置填充选项参数分别对应横坐标纵坐标纵坐标填充起始值填充颜色
plt.fill_between(year, people, 20, color green)
#显示图表
plt.show()
输出结果如下 不过上述解决方案适用于所有操作系统其唯一弊端是每编写一个绘图程序就要添加一次相同的代码。
3、修改配置文件
下面介绍第二种方式通过直接修改配置文件的方法可以一劳永逸的解决 Matplotlib 的中文乱码问题。注意此过程在 Windows 环境下进行。 Matplotlib 从配置文件 matplotlibrc 中读取相关配置信息比如字体、样式等因此我们需要对该配置文件进行更改。首先查看 matplotlibrc 所在的目录使用如下代码确定目录位置
import matplotlib
matplotlib.matplotlib_fname()
输出结果 D:\python\python37\lib\site-packages\matplotlib\mpl-data\matplotlibrc 然后修改配置文件 matplotlibrc。打开配置文件后找到以下信息 #font.family: sans-serif #font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif 将上述配置项前面的#去掉并修改的配置项如下所示 font.family : Microsoft YaHei, sans-serif font.serif: Microsoft YaHei, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif 注意由于版本问题上述内容配置信息可能存在一些差异请自动忽略。 最后在以下目录中复制中文字体微软雅黑 C:\Windows\Fonts\Microsoft YaHei UI 复制完成后将字体粘贴至以下路径文件中 D:\python\python37\lib\site-packages\matplotlib\mpl-data\fonts\ttf 字体粘贴后会出现一个 MSYH.ttc 的字体文件如下所示 编写如下代码进行测试
import matplotlib.pyplot as plt
import numpy as np
x np.linspace(-8, 8, 1024)
y1 0.618 * np.abs(x) - 0.8 * np.sqrt(64 - x ** 2)
y2 0.618 * np.abs(x) 0.8 * np.sqrt(64 - x ** 2)
plt.plot(x, y1, colorr)
plt.plot(x, y2, colorr)
plt.title(我爱C语言中文网,fontsize20,colorb)
plt.show()
输出结果如下 如果你对自己编写的程序没有强烈的“洁癖”可以接受重复的代码那么建议您选择第一种解决方法因为这种方法灵活、轻便。当然您也可以选择第二种方式一劳永逸的解决中文乱码问题。
下一部分将在Matplotlib教程非常详细第二部分展开描述。