Matplotlib学习


matplotlib

address:https://www.matplotlib.org.cn/tutorials/#%E5%BA%8F%E8%A8%80

基本绘图

提供一对相同长度的数组,然后使用plot()绘制曲线.

如果想绘制特别的曲线,有以下修饰

颜色 描述 标记 描述 线条 描述
‘b’ 蓝色 ‘.’ 点标记 ‘-‘ 实线
‘g’ 绿色 ‘o’ 圆圈标记 ‘–’ 虚线
‘r’ 红色 ‘x’ x标记 ‘-.’ 点划线
‘c’ 青色 ‘D’ 钻石标记 ‘:’ 虚线
‘m’ 品红色 ‘H’ 六角标记
‘y’ 黄色 ‘s’ 正方形标记
‘k’ 黑色 ‘+’ 加号标记
‘w’ 白色

如果想在同一幅图里面绘制多条曲线,只需使用多条plot指令即可.如果您想清除图像,直接在程序末尾调用 clf() 方法即可。

figure对象

通过面向对象的思想,将图形封装为图形对象,就能更好的处理控制多个画布.Matplotlib 提供了matplotlib.figure图形类模块,它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。

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

创建画布的步骤如下;

from matplotlib import plot as plt
fig = plt.figure() ## 实例化figure对象
ax=fig.add_axes([0,0,1,1]) ## 添加axes域到画布,这样ax就是我们的画布了

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

ax.set_title("sine wave") ##设置标题
ax.set_xlabel('angle') ##设置x轴标签
ax.set_ylabel('sine') ##设置y轴标签

axes类使用详解

Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。

也就是说一个figure里面能有多个axes对象,每个对象是一幅图,但是一个axes对象只能隶属一个figure画布.

通过调用 add_axes() 方法能够将 axes 对象添加到画布中,该方法用来生成一个 axes 轴域对象,对象的位置由参数rect决定。

rect 是位置参数,接受一个由 4 个元素组成的浮点数列表,形如 [left, bottom, width, height] ,它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度。(每个参数都是相对于画布的分数,是相对距离)

ax=fig.add_axes([0.1,0.1,0.8,0.8])##表示从画布10%开始画,高与宽是画布的80%

legend()绘制图例

axes 类的 legend() 方法负责绘制画布中的图例,它需要三个参数

ax.legend(handles, labels, loc)
  • handles:是一个序列,包含了所有线的实例
  • labels:指定标签名称,也可以在plot的时候,直接命名label
  • loc:指定图例位置
    位置 字符串表示 整数数字表示
    自适应 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

axes.plot()方法

这是axes的基本方法,将一个数组和另一个数组汇成线,其修饰符和plot方法类似

颜色 描述 标记 描述 线条 描述
‘b’ 蓝色 ‘.’ 点标记 ‘-‘ 实线
‘g’ 绿色 ‘o’ 圆圈标记 ‘–’ 虚线
‘r’ 红色 ‘x’ x标记 ‘-.’ 点划线
‘c’ 青色 ‘D’ 钻石标记 ‘:’ 虚线
‘m’ 品红色 ‘H’ 六角标记
‘y’ 黄色 ‘s’ 正方形标记
‘k’ 黑色 ‘+’ 加号标记
‘w’ 白色

axes.grid()设置网格格式

rid() 方法可以开启或者关闭画布中的网格(即是否显示网格)以及网格的主/次刻度。除此之外,grid() 函数还可以设置网格的颜色、线型以及线宽等属性。网格在默认状态下是关闭的,通过调用上述函数,网格会被自动开启,如果只是想开启不带任何样式的网格,可以通过 grid(True) 来实现。

grid(color, ls, lw)
  • color:网格线的颜色
  • ls:网格线的样式
  • lw:网格线的宽度

    设置坐标轴格式

    有时候不同的函数关系,x和y的刻度不应该相同,所以需要通过scale属性设置.

轴是连接刻度的线,也就是绘图区域的边界,在绘图区域(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()

设置坐标轴范围

Matplotlib 可以根据自变量与因变量的取值范围,自动设置 x 轴与 y 轴的数值大小。当然,您也可以用自定义的方式,通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。当对 3D 图像进行设置的时,会增加一个 z 轴,此时使用 set_zlim() 可以对 z 轴进行设置。

示例如下:

import matplotlib.pyplot as plt
import numpy as npy

##生成画布
fig = plt.figure()
ax1 = fig.add_axes([0,0,0.5,0.5])
##自变量生成
x = npy.linspace(0,2*npy.pi,100)
##绘图区域生成
ax1.plot(x,npy.cos(x),'r--',label='cos')
ax1.legend()
##设置y轴取值范围
ax1.set_ylim(-npy.pi,npy.pi)
plt.show()

设置刻度和刻度标签

如果需要将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,自带的刻度就需要自己重新设置。

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

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

也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。

import matplotlib.pyplot as plt
import numpy as npy

##生成画布对象
fig = plt.figure()
#添加绘图区域
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
y = npy.cos(x)
ax.plot(x, y)
#设置x轴标签
ax.set_xlabel(‘angle’)
ax.set_title('sin')
ax.set_xticks([0,2,4,6])
#设置x轴刻度标签
ax.set_xticklabels(['zero','two','four','six'])
#设置y轴刻度
ax.set_yticks([-1,0,1])
plt.show()

subplot()函数

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

plt.subplot(nrows, ncols, index)

subplot如果出现了图像重叠,那么之前的那幅图就会被消除,但是,如果使用figure对象的add_subplot方法就不会被消除,而是两幅图重叠一起.

通过给figure画布创建多个axes对象也能做到subplot的效果.

subplots()函数

subplots() 函数和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的画布。
格式如下

fig , ax = plt.subplots(nrows, ncols)

实例:

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()

subplot2grid()函数

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

plt.subplot2grid(shape, location, rowspan, colspan)
  • shape:把该参数值规定的网格区域作为绘图区域;
  • location:在给定的位置绘制图形,初始位置 (0,0) 表示第1行第1列;
  • rowsapan/colspan:这两个参数用来设置让子区跨越几行几列。
    import matplotlib.pyplot as plt
    import numpy as np
    
    #使用 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)
    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()

双轴图

在需要两个x轴或者两个y轴的情况下,可以使用Matplotlib提供的twinx()和twiny()函数,实现双轴功能.
绘制指数函数和对数函数的示例如下:

import matplotlib.pyplot as plt
import numpy as npy

## 布置画布
fig = plt.figure()
ax1 = fig.add_axes([0,0,1,1])
## 准备自变量x
x = npy.linspace(-5,1,200)
## 绘制指数函数
ax1.plot(x,npy.exp(x),'r',label='exp')
ax1.set_ylabel('exp')
ax1.legend()
## 绘制对数函数
ax2 = ax1.twiny()
ax2.plot(x[x>0],npy.log(x[x>0]),'b--',label='log')
ax2.set_ylabel('log')
ax2.legend()
plt.show()

柱状图

Matplotlib 提供了bar()函数来绘制柱状图。当它与 axes 对象一起使用时,其语法格式如下:

ax.bar(x, height, width, bottom, align)
  • x:标量,代表x坐标
  • height:标量序列,表示柱状图高度
  • width:可选参数,表示柱状图宽度
  • bottom:表示柱状图开始堆叠的起始值
  • align:有两个可选项 {“center”,”edge”},默认为 ‘center’,该参数决定 x 值位于柱状图的位置。

直方图

语法格式:

hist(x,bins,range,density,histtype)
  • x:数组或者数组序列
  • bins:可选参数,整数或者序列,表示每一个间隔的边缘(起点和终点)默认会生成10个间隔。
  • range:指定全局间隔的下限与上限值 (min,max),元组类型,默认值为 None。
  • density:如果为 True,返回概率密度直方图;默认为 False,返回相应区间元素的个数的直方图。
  • histtype:要绘制的直方图类型,默认值为“bar”,可选值有 barstacked(堆叠条形图)、step(未填充的阶梯图)、stepfilled(已填充的阶梯图)。

饼状图

Matplotlib 提供了一个 pie() 函数,该函数可以生成数组中数据的饼状图。您可使用 x/sum(x) 来计算各个扇形区域占饼图总和的百分比。pie() 函数的参数说明如下:

pie(x,labels,color,autopct)
  • x:数组
  • labels:字符串序列,给每一个扇形区域备注一个名字
  • color:为每个扇形区域设置颜色,默认按照颜色周期填充
  • autopct: 格式化字符串”fmt%pct”,使用百分比的格式设置每个扇形
    区的标签,并将其放置在扇形区内。

折线图

matplotlib里面没有绘制折线图的函数,但是可以通过调用text()的方法在图像上绘制注释文本的方法,示例如下:

import matplotlib.pyplot as plt

#准备绘制数据
x = ["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"]
y = [20, 40, 35, 55, 42, 80, 50]
# "g" 表示红色,marksize用来设置'D'菱形的大小
plt.plot(x, y, "g", marker='D', markersize=5, label="周活")
#绘制坐标轴标签
plt.xlabel("登录时间")
plt.ylabel("用户活跃度")
plt.title("C语言中文网活跃度")
#显示图例
plt.legend(loc="lower right")
#调用 text()在图像上绘制注释文本
#x1、y1表示文本所处坐标位置,ha参数控制水平对齐方式, va控制垂直对齐方式,str(y1)表示要绘制的文本
for x1, y1 in zip(x, y):
    plt.text(x1, y1, str(y1), ha='center', va='bottom', fontsize=10)
#保存图片
plt.savefig("1.jpg")
plt.show()

散点图

散点图的语法规范:

scatter(x, y, color)
  • x:自变量
  • y:因变量
  • color:点的颜色

等高线图

如果您想要查看因变量 Z 与自变量 X、Y 之间的函数图像变化(即 Z=f(X,Y)),那么采用等高线图最为直观。

numpy里面有函数meshgrid构建网格点矩阵.

在matplotlob API里面提供了绘制等高线(contour)与填充等高线( contourf)的函数。这两个函数都需要三个参数,分别是 X、Y 与 Z。

示例:

import matplotlib.pyplot as plt
import numpy as npy

## 构建500*500的网格
x = npy.linspace(-10,10,500)
y = npy.linspace(-10,10,500)
X,Y = npy.meshgrid(x,y)
## 构建画布
fig = plt.figure()
ax1 = fig.add_axes([0,0,1,1,])
## 构建函数
Z = npy.log(X**2+Y**2+100)
## 构建等高线
cp = ax1.contourf(X,Y,Z)
fig.colorbar(cp) ##添加颜色柱
ax1.set_title('Test')
ax1.set_ylabel('Y')
ax1.set_xlabel('X')
## 画等高线
plt.show()

3D绘图

通过调用matplotlib的绘图工具包mpl_toolkits.mplot3d的一些接口可以实现绘制3D图形.

基础绘图

首先需要创建一个3D绘图区域,pyplot.axes()这个axes对象构造方法提供了一个参数projection,将其参数值设置为3d.

from mpl_toolkits import mplot3d as m3d
import matplotlib.pyplot as plt
import numpy as npy

ax1 = plt.axes(projection='3d')

然后构建3D图像

#从x,y,z轴开始构建
x = npy.linspace(0,10,200)
y = npy.linspace(0,10,200)
z = npy.exp(x)+npy.hstack((npy.array([0]),npy.log(y[y>0])))

最后调用plot3D()方法构建3d图形

ax1.plot3D(x,y,z,'b')
ax1.set_title('The first 3D')
plt.show()

3D散点图

ax.scatter3D()函数可以绘制 3D 散点图

3D等高线图

ax.contour3D()可以用来创建三维等高线图

3D线框图

plot_wireframe()能够绘制 3D 线框图。

3D曲线图

plot_surface()函数可以绘制 3D 曲面图

Matplotlib绘制文本

Matplotlib通过下列函数绘制出相应内容

函数 解释
text 在绘图区域的任意位置添加文本。
annotate 在绘图区域的任意位置添加带有可选箭头的注释。
xlabel 在绘图区域的 x 轴上添加标签。
ylabel 在绘图区域的 y 轴上添加标签。
title 为绘图区域添加标题。
figtext 在画布的任意位置添加文本。
suptitle 为画布中添加标题。

Matplotlib数学表达式

Matplotlib 中的文本字符串都可以使用 Text Markup(一种文本标记语言)显现出来,Text Markup类似Mathjax.


Author: Dovahkiin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Dovahkiin !
  TOC