1.Matplotlib介绍和基础操作

Matplotlib介绍和基础操作

从这里开始,我们将讲解Matplotlib中实现数据可视化的方法

这一章将首先对Matplotlib进行介绍,然后讲解Matplotlib中的一些基础操作

我们使用如下的约定import matplotlib.pyplot as plt,import matplotlib as mtl


Matplotlib介绍

Matplotlib的历史

Matplotlib是建立在Numpy数组基础上的多平台数据可视化程序库,最初被设计为用于完善SciPy的生态环境

Matplotlib是由John Hunter在2002年提出的一个构思:希望通过一个IPython的补丁来让IPython的命令行能够绘制像MATLAB风格的图
于是John就将所有的绘图的IPython补丁做成了Matplotlib程序包,并且在2003年发布了0.1版本
后来美国太空望远镜科学研究所(Space Telescope Science Institute, STScI,哈勃望远镜背后的团队,位于约翰霍普金斯大学)选择了Matplotlib作为绘图工具,并且一直为Matplotlib开发的背后团队提供资金支持,从而大大扩展了Matplotlib的功能,直到现在,Matplotlib依旧在持续的更新

但是Matplotlib最初的创始者John却在2012年因为癌症去世.

Matplotlib最重要的一个特性就是具有良好的操作系统兼容性和图层显示底层接口兼容性.Matplotlib支持十几种图形显示接口与输出格式,因此能够让用户在不同的操作系统上输出自己想要的图形格式

Matplotlib是一个比较接近底层(虽然实际用起来并不底层)的绘图库,这就意味Matplotlib在绘图上给予了用户极大的灵活性,只要掌握了Matplotlib的知识就能够绘制出高度定制化的图像

而且现在有许多基于Matplotlib的基础上开发的高级绘图库,能够实现绘制地图图或者具有更加简洁的API,例如Seaborn,ggplot,Holo Views,Altair等库

此外,不得不说的一点是前面讲解过的Pandas这个库.虽然从现在的角度来说Pandas是数据科学必不可少的库,但是由于Pandas发布时间其实晚于Matplotlib.所以Pandas实际上也封装了Matplotlib的绘图函数,例如我们在Pandas中调用DataFrame和Series对象的plot方法.而且也正是因为Pandas的发布时间晚于Matplotlib,所以Matplotlib在最初的几个版本对Pandas的支持很差,不过现在Matplotlib已经完美的支持Pandas了

Matplotlib的构成

Matplotlib构成

Matplotlib中有两套接口分别是pyplot和pyylab,即绘图时候主要导入的是Matplotlib库下的两个子模块(两个py文件)matplotlib.pyplotmatplotlib.pylab

这两个模块都能实现绘制图像,并且两个模块在绘图的时候实际上运行的是同一段代码

之所以有区别是因为两个模块的目的不一样,pylab模块是对标MATLIB而存在的,因此所有的语句实际上和MATLIB很类似,例如numpy中的np.arange,如果导入了pylab就直接用arange即可,这就非常类似于MATLAB.之所以非常相像就是因为pylab中以from numpy import *的形式导入的Numpy中的所有函数,对象及方法.同时也以类似的方法导入了pyplot中的函数对象和方法.这样就将Numpy与pyplot中的内容导入到同一个命名空间

但实际上为了便于管理以及不搞混命名空间,实际上还是推荐分别导入,即import numpy,import matplotlib.pyplot

Matplotlib.pyplot构成

上面说了,我们一般最好还是导入matplotlib.pyplot这个文件

但是matplotlib.pyplot模块中有一个令人混淆的特性,就是其中依旧提供了两套接口

  1. 一个是便捷的MATLAB风格接口(这里和pylab不一样,pylab是让代码外观更加接近),例如:plt.plot(),plt.subplot(2,1,1)
    这种接口是有状态的(即当前绘制的图像),它会持续的跟踪当前的图像,即我们后面所调用的各种绘制图像,增加/修改图例都是对当前图像的.
    虽然这种接口强大简单,但是当当前图像具有子图时,如何从子图回到原图进行绘制就是一个问题.虽然使用MATLAB接口能够做到回到原图,但是很复杂.

  2. 另一个是功能更加强大的面向对象的接口,这套接口将一幅图像中的各个部分抽象成了一个个对象,然后每个对象中具有一系列可以用于调整该部分的方法,因此这套面向对象的结构实际上更加强大.对于上面子图的问题,面向对象的接口将子图和原图抽象为对象,在需要的时候直接调用即可

Matplotlib基础

Matplotlib图片构成

前面已经就介绍过了,Matplotlib.pyplot中的面向对象接口将一个图像的各个部分抽象为了诸多对象,所以我们首先需要知道Matplotlib中一张图片的所有构成部分

在这里插入图片描述

这里主要就Matplotlib中两个容易搞混的部分进行讲解,即Figure和Axes

Figure–图像

Figure通俗的理解,就是我们使用我们后面将讲解的plt.show()函数时候将弹出的系统窗口,形象的比喻就是画家作画时的画布,即绘制的图像的承载对象.一个图像将会包含所有的子内容,即子图Axes

一个Figure图像可以具有任意的子图

Figure在代码中的体现就是Matplotlib中的figure类:<class ‘matplotlib.figure.Figure’>

创建一个Figure对象可以使用面向对象接口,而使用MATLAB风格接口时绘完图像后使用plt.show函数时将会自动将会创建一个Figure对象

#使用plt.figure()
fig=plt.figure()
print(type(fig))
>>>
<class 'matplotlib.figure.Figure'>
#使用plt.subplots()
fig,ax=plt.subplots(1)
print(type(fig),'\t',type(ax))
>>>
<class 'matplotlib.figure.Figure'>       <class 'matplotlib.axes._subplots.AxesSubplot'>

注意,使用plt.subplot()函数将会同时创建Figure对象和Axes对象,如果指定的子图数量大于2将会返回一个以Axes对象为元素的列表

Axes–子图

子图即我们所‘’认为的图像’,例如上面绘制的包含x轴名称,y轴名称,x轴刻度,y轴刻度,标题,散点图等等在内的图形

和Figure对象类似,Axes子图是以AxesSubplot对象存在的

创建Axes对象同样有两种方法

#使用plt.axes()
Axe=plt.axes()
print(type(Axe))
>>>
<class 'matplotlib.axes._subplots.AxesSubplot'>
#使用plt.subplots()
fig,ax=plt.subplots(1)
print(type(fig),'\t',type(ax))
>>>
<class 'matplotlib.figure.Figure'>       <class 'matplotlib.axes._subplots.AxesSubplot'>

显示与保存图像

显示图像–plt.show()函数

如果你使用的是Python2.7,使用plt.show()来显示图形的时候可能会出现如下的报错

UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.

这是因为一个图像被Matplotlib绘制出来后,实际上是以数据的形式暂时保存在缓存中,我们如果想要图像能够显示在屏幕上,就需要使用GUI(用户图形界面)来显示图像

而Python2.7版本对应的Matplotlib实际上使用的是agg,一个无法调用系统图形界面来显示的后端,对此我们可以使用TkAgg这个可以显示图线的后端来显示图像

话说回来,我们将图像绘制好之后是保存在缓存中的,这个时候我们需要使用plt.show()函数来显示图像

plt.show()函数在背后为我们做了很多事情,例如与操作系统沟通,调用GUI来显示图像等等,所以我们如果使用VScode这类偏向于系统底层的工具的话,就需要plt.show()来显示图形,但是如果使用的IPython,Jupyter这类集成化工具的话,他们已经做了plt.show()应该做的事,因此就不需要使用plt.show()命令

保存图像–plt.savefig与fig.savefig

前面所介绍的pyplot中有两套接口,如果我们使用MATLAB风格的接口的话,就需要使用plt.savefig()来保存图像

如果使用的是面向对象得接口的话,就需要使用fig对象的savefig()方法来保存图像

例如

#MATLAB风格接口
x=np.arange(start=-np.pi,stop=np.pi,step=0.1)
y=np.sin(x)
plt.plot(x,y)
fig.savefig('sin.png')
#面向对象接口
x=np.arange(start=-np.pi,stop=np.pi,step=0.1)
y=np.sin(x)
fig,ax=plt.subplots(1)
ax.plot(x,y)
fig.savefig('sin.png')

上面在面向对象接口中,我们使用plt.subplots()函数来创建一个figure对象和AxesSubplot(即Axes)对象

在保存图像时候,指定名称的后缀名即最终图像的格式

设置绘图样式

pyplot中提供了许多绘图样式,具体有:

‘bmh’, ‘classic’, ‘dark_background’, ‘fast’, ‘fivethirtyeight’, ‘ggplot’, ‘grayscale’, ‘seaborn-bright’, ‘seaborn-muted’, ‘seaborn-notebook’, ‘seaborn-paper’, ‘seaborn-pastel’, ‘seaborn-poster’, ‘seaborn-talk’, ‘seaborn-ticks’, ‘seaborn-white’, ‘seaborn-whitegrid’, ‘seaborn’, ‘Solarize_Light2’, ‘tableau-colorblind10’, ‘_classic_test’

我们需要使用plt.style.use来指定使用的绘图风格

plt.style.use('classic')

调整图形

在正式讲解各种图像(散点图,柱状图,扇形图,频数直方分布图等)前,还需要掌握的一个基础就是对图像进行调整,包括线条的颜色和样式,坐标轴的上下限

设置坐标轴上下限

虽然Matplotlib会自动会为我们的图形选择合适的坐标轴上下限,但是有的时候自定义坐标轴的上下限会更好

plt.xlim()与plt.ylim()函数

我们可以分别给plt.xlim()与plt.ylim()传入坐标轴的范围来设置上下限

在这里插入图片描述

我们可以逆序给定坐标值,这样将会就会逆序生成坐标刻度值

fig=plt.figure()
plt.xlim(0,-10)
plt.ylim(-10,0)
plt.show()

在这里插入图片描述

plt.axis()函数

我们也可以使用plt.axis()函数来设置坐标值,此时和MATLAB很像,传入[xmin,xmax,ymin,ymax]数组即可

plt.axis()函数同样支持逆序刻度值

fig=plt.figure()
plt.axis([0,-10,0,10])
plt.show()

在这里插入图片描述

此外,plt.axis()函数还支持许多其他的参数,例如:根据图像来收紧坐标轴,不留上下左右空白;让x轴和y轴刻度间距相等

在这里插入图片描述

设置图形标签

图形标签包含图形的标题,坐标轴名称,和图例

首先需要指出的是,Matplotlib对中文的支持不是很好,所以直接给图形标签中文将会无法显示

plt.title()

我们可以用plt.title()来为图像添加标题

plt.xlabel()和plt.ylabel()

我们可以使用plt.xlabel()和plt.ylabel()来为x轴和y轴添加名称

plt.legend()

我们可以使用plt.legend来为图像添加图例

我们如果为每条线指定了label属性的话,那么直接使用plt.legend即可,如果没有指定label属性,就需要为plt.legend()属性传入描述数组

案例

上述几个设置图形标签的例子如下

x=np.arange(start=-np.pi,stop=np.pi,step=0.01)
y_sin=np.sin(x)
y_cos=np.cos(x)

Fig=plt.figure(1)
plt.plot(x,y_sin,label='Sin(x)')
plt.plot(x,y_cos,label='Cos(x)')

plt.title('Figure of Sin ans Cos')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()

plt.show()

在这里插入图片描述

此外,显示图例的另外一种方式就是为plt.legend传递描述数组,这个时候每一个描述字符串要和绘制的图线按顺序对应

x=np.arange(start=-np.pi,stop=np.pi,step=0.01)
y_sin=np.sin(x)
y_cos=np.cos(x)

Fig=plt.figure(1)
plt.plot(x,y_sin)
plt.plot(x,y_cos)

plt.title('Figure of Sin ans Cos')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(['Sin(x)','Cos(x)'])

plt.show()

效果和上面是一样的

在这里插入图片描述

面向对象的接口

上面所讲的各种调整图形的函数其实都是MATLAB风格的接口,那么自然我们还需要掌握对应的面向对象的接口

所有调整图像的工具其实都是AxesSubplot对象的方法,只不过名字有区别,所以这里是一个坑,因为绝大多数的MATLAB接口和对应的面向对象的接口名字是相同的,例如plt.legend–>ax,legend

MATLAB函数对应的AxesSubplot对象的方法
plt.title()AxesSubplot对象.set_title()
plt.xlabel()AxesSubplot对象.set_xlabel()
plt.ylabel()AxesSubplot对象.set_ylabel()
plt.xlim()AxesSubplot对象.set_xlim()
plt.ylim()AxesSubplot对象.set_ylim()

或者我们直接调用AxesSubplot对象的set方法,来直接完成所有设定

x=np.arange(start=-np.pi,stop=np.pi,step=0.01)
y_sin=np.sin(x)
y_cos=np.cos(x)

Fig,Axes=plt.subplots(1)
Axes.plot(x,y_sin)
Axes.plot(x,y_cos)
Axes.set(xlim=(-np.pi,np.pi),ylim=(-1,1),xlabel='x',ylabel='y',title='Figure of Sin and Cos')
Axes.legend(['Sin(x)','Cos(x)'])
plt.show()

在这里插入图片描述

设置线条颜色与风格

设置颜色

我们可以使用多种方式来设置线条的颜色,包括标准颜色名称,缩写颜色代码,范围在0~1的灰度值,十六进制RGB值,0~1之间的RGB元组,HTML颜色名称等

x=np.arange(start=-np.pi,stop=np.pi,step=0.01)

plt.figure()

plt.plot(x,np.sin(x),color='blue',label='Stander Color Name')			#使用标准的颜色名称
plt.plot(x,np.sin(x+1),color='g',label='regbcmyk')						#缩写颜色代码(rgbcymk)
plt.plot(x,np.sin(x+2),color='0.75',label='GrayScale')					#范围在0~1的灰度值
plt.plot(x,np.sin(x+3),color='#32EC70',label='HexColor')				#十六进制颜色,#RRGGBB,00~FF
plt.plot(x,np.sin(x+4),color=(1.0,0.25,0.431),label='Tuple')			#0~1之间的RGB元组
plt.plot(x,np.sin(x+5),color='chartreuse',label='HTML Color')			#HTML颜色名称

plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Color Style')
plt.show()

在这里插入图片描述

如果我们不指定颜色,那么Matplotlib会循环使用一组颜色值

设置线条样式

我们可以指定linestyle参数来使用设置线条的样式,而且针对同样的样式,我们可以用全写也可以用缩写

x=np.arange(start=-np.pi,stop=np.pi,step=0.01)

plt.figure()

plt.plot(x,np.sin(x),color='blue',linestyle='solid',label='Solid_full')
plt.plot(x,np.sin(x)-3,color='blue',linestyle='-',label='Solid_abbr')
plt.plot(x,np.sin(x+1),color='g',linestyle='dashed',label='DashedLine_full')
plt.plot(x,np.sin(x+1)-3,color='g',linestyle='--',label='DashedLine_abbr')
plt.plot(x,np.sin(x+2),color='0.75',linestyle='dashdot',label='DashedDot_full')
plt.plot(x,np.sin(x+2)-3,color='0.75',linestyle='-.',label='DashedDot_abbr')
plt.plot(x,np.sin(x+3),color='#32EC70',linestyle='dotted',label='Dotted_full')
plt.plot(x,np.sin(x+3)-3,color='#32EC70',linestyle=':',label='Dotted_abbr')

plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Line Style')
plt.show()

在这里插入图片描述

同时指定颜色与样式

最后,我们可以指定非关键来同时设置颜色和样式

x=np.arange(start=-np.pi,stop=np.pi,step=0.01)

plt.plot(x,np.sin(x),'g--')
plt.plot(x,np.sin(x+1),'b:')
plt.plot(x,np.sin(x+2),'r-.')

plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Line Style')
plt.show()

在这里插入图片描述

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: matplotlib是一个Python图形绘制包,而matplotlib.pyplot是matplotlib的一个模块,它提供了简单的API,可以让用户在不进行复杂编程的情况下进行绘图。因此,matplotlib.pyplot可以说是matplotlib的一个子模块,它提供了简单的API来实现绘图功能。 ### 回答2: matplotlib是一个Python的绘图库,而matplotlib.pyplot是matplotlib库的一个子模块。 matplotlib是一个综合性的绘图工具,它提供了多样化的绘图选项,包括线图、散点图、柱状图、饼图等等。它可以用于创建基础图形并具备一些绘图的默认设置。同时,matplotlib还提供了一些高级绘图的功能,如绘制子图、设置坐标轴范围、添加图例等。 matplotlib.pyplot是一个用于交互式绘图的子模块。它提供了与MATLAB类似的绘图函数接口,方便用户进行快速的绘图操作。使用pyplot模块,用户可以直接绘制图形、添加图像标签、设置标题等。pyplot还提供了一些方便的工具函数,如保存图像、显示图像等,使得用户能够更轻松地管理和展示绘图结果。 简而言之,matplotlib是一个完整的绘图库,而matplotlib.pyplot是用于交互式绘图的一个方便的子模块。两者的关系是matplotlib.pyplot基于matplotlib库进行开发和扩展的。用户可以根据需要选择使用哪一个来进行绘图操作。 ### 回答3: matplotlib是一个Python绘图库,提供了一种绘制各种静态、动态、交互性图形的方法。它包含了各种绘图函数和类,可以绘制线图、散点图、柱状图、饼图等各种类型的图形。 matplotlib.pyplot是matplotlib库中的一个模块,它提供了与MATLAB类似的图形绘制工具。它封装了很多常用的绘图函数和命令,并提供了简单方便的绘图接口,使得绘图过程更加快速、简单。使用pyplot绘图可以快速实现绘图的各种功能,而不需要编写复杂的代码。 matplotlib.pyplot是对matplotlib库的高级封装,方便用户快速进行绘图操作。它提供了很多用于图形绘制的函数,比如plot()用于绘制线图,scatter()用于绘制散点图等。使用pyplot可以快速设置图像标题、坐标轴标签、图例等属性。此外,pyplot还提供了一些与图形交互相关的功能,比如与鼠标的交互、键盘事件等,使得绘图更具交互性。 总之,matplotlib是一个功能强大的绘图库,而matplotlib.pyplot是其一个方便易用的子模块。使用pyplot可以快速进行绘图操作,并实现各种绘图的功能和交互性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值