开发者社区> 小小程序员(CSDN)> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【数据可视化】Matplotlib 入门篇

简介: 讲述Matplotlib如何用PYLab、figure等进行数据可视化
+关注继续查看

PyLab

PyLab 是一个面向 Matplotlib 的绘图库接口,其语法和 MATLAB 十分相近。它和 Pyplot 模快都够实现 Matplotlib 的绘图功能。PyLab 是一个单独的模块,随 Matplotlib 软件包一起安装,该模块的导包方式和 Pyplot 不同,如下所示:

  1. \#Pyplot导包方式
  2. from matplotlib import pyplot as plt
  3. \#PyLab导包有两种方式
  4. import pylab
  5. from pylab import *

PyLab 是一个很便捷的模块,下面对它的使用方法做相应的介绍。

基本绘图

绘制曲线图

提供一对相同长度的数组(或序列),然后使用plot()绘制曲线,示例如下:

from numpy import *
from pylab import *
x=linspace(-5,5,30)
y=x**4
plot(x,y)

输出结果:

红点曲线图

如果您要绘制特殊类型的线条,并想添加一些颜色,PyLab 提供了如下方法:

符号'-','--','-.',':','.',',',,o,^,v,\<,\>,s,+,x,D,d,1,2,3,4,h,H,p,\,\_
颜色b(蓝色),g(绿色),r(红色),c(青色),m(品红),y(黄色),k(黑色),w(白色)

使用示例如下:

from numpy import *
from pylab import *
x=linspace(-5,5,30)
y=x**4
plot(x,y,'g.')

输出结果:

绘制多条不同曲线

如果您想在同一绘图区域内绘制多个图形,只需要使用多个绘图命令。示例如下:

from pylab import *
import numpy as np
import math 
x=np.arange(0,math.pi*2,0.01)
plot(x,sin(x))
plot(x,cos(x),'g-.')
plot(x,-cos(x),'r--')

输出结果:

figure

Matplotlib 提供了matplotlib.figure图形类模块,它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。如下所示:

  1. from matplotlib import pyplot as plt
  2. \#创建图形对象
  3. fig = plt.figure()

该函数的参数值,如下所示:

参数说明
figsize指定画布的大小,(宽度,高度),单位为英寸。
dpi指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。
facecolor背景颜色。
dgecolor边框颜色。
frameon是否显示边框。

figure图形绘制

figure() 创建一个空白画布:

fig = plt.figure()

我们使用 add_axes() 将 axes 轴域添加到画布中。如下所示:

ax=fig.add_axes([0,0,1,1])

add_axes() 的参数值是一个序列,序列中的 4 个数字分别对应图形的左侧,底部,宽度,和高度,且每个数字必须介于 0 到 1 之间。

设置 x 和 y 轴的标签以及标题,如下所示:

  1. ax.set_title("sine wave")
  2. ax.set_xlabel('angle')
  3. ax.set_ylabel('sine')

调用 axes 对象的 plot() 方法,对 x 、 y 数组进行绘图操作:

ax.plot(x,y)

完整的代码如下所示:

import numpy as np
from matplotlib import pyplot as plt
import math
x=np.arange(-math.pi*4,math.pi*4,0.01)
y=sin(x)
fig=plt.figure()
ax=fig.add_axes([0,0,1,1])
ax.plot(x,y,'r-.')
ax.set_title("sin")
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

输出结果如下:

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

axes.plot()

这是 axes 类的基本方法,它将一个数组的值与另一个数组的值绘制成线或标记,plot() 方法具有可选格式的字符串参数,用来指定线型、标记颜色、样式以及大小。

颜色代码如下表:

'b'蓝色
'g'绿色
'r'红色
'c'青色
'm'品红色
'y'黄色
'k'黑色
'w'白色

标记符号如下表:

标记符号描述
'.'点标记
'o'圆圈标记
'x''X'标记
'D'钻石标记
'H'六角标记
's'正方形标记
'+'加号标记

线型表示字符,如下表:

字符描述
'-'实线
'--'虚线
'-.'点划线
':'虚线
'H'六角标记

下面的例子,以直线图的形式展示了电视、智能手机广告费与其所带来产品销量的关系图。其中描述电视的是带有黄色和方形标记的实线,而代表智能手机的则是绿色和圆形标记的虚线。

from matplotlib import pyplot as plt
import numpy as np
import math
x=np.arange(-math.pi*2,math.pi*2,0.001)
y=cos(x)
y1=sin(x)
fig=plt.figure()
ax=fig.add_axes([0.1,0.1,1.2,1.2])
ax.plot(x,y,'r-.')
ax.plot(x,y1,'g-.')
ax.legend(labels=('cos','sin'),loc='lower right')
ax.set_title("sin and cos")
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

输出结果如下:

subplot

matplotlib.pyplot模块提供了一个 subplot() 函数,它可以均等地划分画布,该函数的参数格式如下:

plt.subplot(nrows, ncols, index)

nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。

例如: subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时,选择在第 3 个位置绘制子图。


图1:示意图

如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。

from matplotlib import pyplot as plt
plt.subplot(311)
plt.plot(facecolor='g')
plt.plot(range(20))
plt.subplot(312,facecolor='y')
plt.plot(range(10))
plt.subplot(313,facecolor='c')
plt.plot(range(15))

上述代码运行结果,如下图所示:

图2:subplot绘制结果

如果不想覆盖之前的图,需要使用 add_subplot() 函数,代码如下:

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111,facecolor='w')
ax1.plot([1,2,3])
ax2 = fig.add_subplot(221, facecolor='y')
ax2.plot([1,2,3])

执行上述代码,输出结果如下:


图3:add_subplot()绘图结果

通过给画布添加 axes 对象可以实现在同一画布中插入另外的图像。

from matplotlib import pyplot as plt
import numpy as np
import math
x=np.arange(-math.pi*2,math.pi*2,0.01)
y1=np.sin(x)
y2=np.cos(x)
fig=plt.figure()
ax1=fig.add_axes([0,0,1,1])
ax2=fig.add_axes([0.8,0.8,0.9,0.9])
ax1.set_xlabel('x')
ax2.set_xlabel('x')
ax1.set_ylabel('sin(x)')
ax2.set_ylabel('cos(x)')
ax1.set_title("sin(x)")
ax2.set_title("cos(x)")
ax1.plot(x,y1,'r-.')
ax2.plot(x,y2,'g-.')
plt.show()

输出结果如下:


图4:输出结果图

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 个不同的图像。

from matplotlib import pyplot as plt
import numpy as np
fig,a=plt.subplots(2,2)
x=np.arange(-10,10,0.01)
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('sqrt')
a[1][0].plot(x,exp(x))
a[1][0].set_title('exp(x)')
a[1][1].plot(x,log2(x))
a[1][1].set_title('log2(x)')
plt.show()

上述代码的输出结果如下:

subplot2grid()

matplotlib.pyplot 模块提供了 subplot2grid() ,该函数能够在画布的特定位置创建 axes 对象(即绘图区域)。不仅如此,它还可以使用不同数量的行、列来创建跨度不同的绘图区域。与 subplot() 和 subplots() 函数不同,subplot2gird() 函数以非等分的形式对画布进行切分,并按照绘图区域的大小来展示最终绘图结果。

函数语法格式如下:

plt.subplot2grid(shape, location, rowspan, colspan)

参数含义如下:

  • shape:把该参数值规定的网格区域作为绘图区域;
  • location:在给定的位置绘制图形,初始位置 (0,0) 表示第1行第1列;
  • rowsapan/colspan:这两个参数用来设置让子区跨越几行几列。

下面,在画布(figure)中添加了行、列跨度均不相同的绘图子区域,然后在每个绘图区上,绘制不同的图形。示例代码如下:

from matplotlib import pyplot as plt
import numpy as np
import math
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),colspan=2,rowspan=2)
x=np.arange(-math.pi*2,math.pi*2,0.1)
a1.plot(x,np.sin(x),'r-.')
a2.plot(x,np.exp(x),'c-')
a3.plot(x,np.cos(x),'g-.')
plt.show()

输出结果如下:

图1:subplot2grid()输出结果

grid()

grid() 的函数使用格式如下:

grid(color='b', ls = '-.', lw = 0.25)

参数含义如下:

  • color:表示网格线的颜色;
  • ls:表示网格线的样式;
  • lw:表示网格线的宽度;

网格在默认状态下是关闭的,通过调用上述函数,网格会被自动开启,如果您只是想开启不带任何样式的网格,可以通过 grid(True) 来实现。

from matplotlib import pyplot as plt
import numpy as np
import math
fig,a=plt.subplots(1,3,figsize=(12,6))
x=np.arange(0,20,1)
a[0].plot(x,x**3,'g-.',lw=2)
a[0].grid(True)
a[0].set_xlabel('x')
a[0].set_ylabel('y')
a[0].set_title("y=x**3")
a[1].plot(x,np.exp(x),'r--',lw=2)
a[1].grid(True)
a[1].set_xlabel('x')
a[1].set_ylabel('y')
a[1].set_title("y=exp(x)")
a[2].plot(x,np.log2(x),'c-',lw=2)
a[2].grid(True)
a[2].set_xlabel('x')
a[2].set_ylabel('y')
a[2].set_title("y=.log2(x)")
fig.tight_layout()
fig.show()

上述代码执行后,输出结果


图1:输出结果

在一个函数图像中,有时自变量 x 与因变量 y 是指数对应关系,这时需要将坐标轴刻度设置为对数刻度。Matplotlib 通过 axes 对象的xscale或yscale属性来实现对坐标轴的格式设置。

示例:右侧的子图显示对数刻度,左侧子图则显示标量刻度。

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. fig, axes = plt.subplots(1, 2, figsize=(10,4))
  4. x = np.arange(1,5)
  5. axes[0].plot( x, np.exp(x))
  6. axes[0].plot(x,x**2)
  7. axes[0].set_title("Normal scale")
  8. axes[1].plot (x, np.exp(x))
  9. axes[1].plot(x, x**2)
  10. \#设置y轴
  11. axes[1].set_yscale("log")
  12. axes[1].set_title("Logarithmic scale (y)")
  13. axes[0].set_xlabel("x axis")
  14. axes[0].set_ylabel("y axis")
  15. axes[0].xaxis.labelpad = 10
  16. \#设置x、y轴标签
  17. axes[1].set_xlabel("x axis")
  18. axes[1].set_ylabel("y axis")
  19. plt.show()


图1:对数关系图

轴的设置

轴是连接刻度的线,也就是绘图区域的边界,在绘图区域(axes 对象)的顶部、底部、左侧和右侧都有一个边界线(轴)。通过指定轴的颜色和宽度,从而对进行显示格式设置,比如将所有轴的颜色设置为 None,那么它们都会成为隐藏状态,或者也可以给轴添加相应的颜色。以下示例为左侧轴、底部轴分别设置了红色、蓝色,如下所示:

  1. import matplotlib.pyplot as plt
  2. fig = plt.figure()
  3. ax = fig.add_axes([0,0,1,1])
  4. \#为左侧轴,底部轴添加颜色
  5. ax.spines['bottom'].set_color('blue')
  6. ax.spines['left'].set_color('red')
  7. ax.spines['left'].set_linewidth(2)
  8. \#将侧轴、顶部轴设置为None
  9. ax.spines['right'].set_color(None)
  10. ax.spines['top'].set_color(None)
  11. ax.plot([1,2,3,4,5])
  12. plt.show()

输出结果如下:

设置x,y轴

Matplotlib 可以根据自变量与因变量的取值范围,自动设置 x 轴与 y 轴的数值大小。当然,您也可以用自定义的方式,通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。

当对 3D 图像进行设置的时,会增加一个 z 轴,此时使用 set_zlim() 可以对 z 轴进行设置。

下面示例分别对自动设置和自定义设置做了演示:第一种 Matplotlib 自动设置

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. fig = plt.figure()
  4. \#添加绘图区域
  5. a1 = fig.add_axes([0,0,1,1])
  6. \#准备数据
  7. x = np.arange(1,10)
  8. \#绘制函数图像
  9. a1.plot(x, np.exp(x))
  10. \#添加题目
  11. a1.set_title('exp')
  12. plt.show()

代码执行后,输出结果如下:


图1:输出结果

第二种:自定义设置,set_xlim() 将 x 轴的数值范围设置为(0到10); set_ylim() 将 y 轴的范围设置为(0到10000)。

from matplotlib import pyplot as plt
import numpy as np
import math
x=np.arange(0,10)
y=np.exp(x)
plg=plt.figure()
a1=plg.add_axes([0,0,1,1])
a1.plot(x,y)
a1.set_xlim(0,15)
a1.set_ylim(0,10000)

输出结果如下:

设置刻度

刻度指的是轴上数据点的标记,Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。

xticks() 和 yticks() 函数接受一个列表对象作为参数,列表中的元素表示对应数轴上要显示的刻度。如下所示:

ax.set_xticks([2,4,6,8,10])

x 轴上的刻度标记,依次为 2,4,6,8,10。您也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。

下面示例对刻度和标签的使用方法做了说明。

from matplotlib import pyplot as plt
import numpy as np
import math
x=np.arange(0,10)
y=np.exp(x)
plg=plt.figure()
a1=plg.add_axes([0,0,1,1])
a1.plot(x,y)
a1.set_xticklabels([i for i in range(11)])
a1.set_yticklabels([math.e**i for i in range(10)])

输出结果如下:


图1:绘制坐标轴刻度与标签

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
10分钟入门Matplotlib: 数据可视化介绍&使用教程(三)
10分钟入门Matplotlib: 数据可视化介绍&使用教程(三)
0 0
10分钟入门Matplotlib: 数据可视化介绍&使用教程(二)
10分钟入门Matplotlib: 数据可视化介绍&使用教程(二)
0 0
10分钟入门Matplotlib: 数据可视化介绍&使用教程(一)
10分钟入门Matplotlib: 数据可视化介绍&使用教程(一)
0 0
Matplotlib数据可视化:图片展示与保存
Matplotlib数据可视化:图片展示与保存
0 0
Matplotlib数据可视化:饼图与箱线图
Matplotlib数据可视化:饼图与箱线图
0 0
Matplotlib数据可视化:柱状图与直方图
Matplotlib数据可视化:柱状图与直方图
0 0
Matplotlib数据可视化:折线图与散点图
Matplotlib数据可视化:折线图与散点图
0 0
Matplotlib数据可视化:文本与坐标轴
Matplotlib数据可视化:文本与坐标轴
0 0
Matplotlib数据可视化:三大容器对象与常用设置(下)
Matplotlib数据可视化:三大容器对象与常用设置(下)
0 0
Matplotlib数据可视化:三大容器对象与常用设置(上)
Matplotlib数据可视化:三大容器对象与常用设置(上)
0 0
+关注
小小程序员(CSDN)
专业:数据科学与大数据技术 兴趣:人工智能、开发
文章
问答
文章排行榜
最热
最新
相关电子书
更多
WebGL在数据可视化中的实践
立即下载
即学即用的Pandas入门与时间序列分析
立即下载
中文:即学即用的Pandas入门与时间序列分析
立即下载