博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Matplotlib入门教程
阅读量:3960 次
发布时间:2019-05-24

本文共 9171 字,大约阅读时间需要 30 分钟。

Matplotlib入门教程

先给出我认为比较好的其他教程

文章目录

一.简介

Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab的启发而研发,matplotlib.pyplot是绘制各类可视化图形的命令子库,引入方式如下:

import  matplotlib.pyplot as plt;

1.小测:

1.

import matplotlib.pyplot as pltplt.plot([2,1,4,43])plt.ylabel("Y")plt.xlabel("X")

在这里插入图片描述

当plot的参数为数组或列表时,那么将被当做y轴参数,而X轴自动生成

2.

import matplotlib.pyplot as pltplt.plot([2,1,4,43])plt.ylabel("Y")plt.xlabel("X")plt.savefig("math.png",dpi=600)plt.show()

在这里插入图片描述

在这里插入图片描述

savefig将图形存储为文件,格式默认为png,也可以自行加后缀改为jpg,通过修改dpi的值调整大小与质量

3.

import matplotlib.pyplot as pltplt.plot([-1,1,2,3],[4,7,2,8])plt.ylabel("Y")plt.xlabel("X")plt.axis([-2,4,1,10])plt.show()

在这里插入图片描述

plot有两个参数时,第一个代表横坐标,第二个代表纵坐标,上面axis的参数表示横轴的范围是-2-4,纵轴的范围是1-10

2.pyplot的绘图区域

plt.subplot(nrows,ncols,plot_num),其中nrows-1表示横轴的个数,ncols表示纵轴的个数,plot_num表示对应在第几个区域,当调用函数后,在他之后的图形会被绘制在plot_num对应的区域内

举例分析

比如:plt.subplot(3,2,4)
在这里插入图片描述

小技巧:上面的plt.subplot(3,2,4)可以写为plt.subplot(324)效果一样

4.

绘制函数 c o s ( 2 π x ) cos(2{\pi}x) cos(2πx) e − x e^{-x} ex, c o s ( 2 π x ) cos(2{\pi}x) cos(2πx)

import numpy as npimport matplotlib.pyplot as pltdef f(x):    return np.exp(-x)*np.cos(np.pi*x*2)x = np.arange(0,5.0,0.02)plt.subplot(2,1,1)plt.plot(x,f(x))plt.xlabel("X轴")plt.ylabel("Y轴")plt.subplot(2,1,2)plt.plot(x,np.cos(2*np.pi*x))

下面这张图保证了将两个函数画在了同一张图里

在这里插入图片描述

二.plot()函数的使用

在这里插入图片描述

import numpy as npimport matplotlib.pyplot as pltx = np.arange(10)plt.plot(x,x,x,1.5*x,x,2*x)

绘制三条曲线:

在这里插入图片描述
下面介绍format_string参数的使用
format_string:控制曲线格式的字符串,是可选参数,由颜色字符,风格字符,标记字符组成

颜色字符:

在这里插入图片描述

风格字符:

在这里插入图片描述
标记字符
在这里插入图片描述
上面介绍了部分,详细参见

以上的风格字符,颜色字符,标记字符可以任意的组合使用

下面做一些展示,在上面代码基础上改进

import numpy as npimport matplotlib.pyplot as pltx = np.arange(10)plt.plot(x,x,'og-',x,1.5*x,'r:v',x,2*x,'b--.')

在这里插入图片描述

当然还有一些其它的参数的使用也可以用来控制曲线
在这里插入图片描述

pyplot的中文显示

我们要了解pyplot其实并不默认支持中文显示,需要修改使用

方法一

使用rcParams修改字体实现

先看个例子

import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(10)matplotlib.rcParams["font.family"]='SimHei'   #'SimHei'表示黑体plt.ylabel("Y轴")plt.plot(x,x)

在这里插入图片描述

rcParams的属性介绍:
在这里插入图片描述
font.family取值:
在这里插入图片描述
下面看个例子

import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(10)matplotlib.rcParams["font.family"]='SimHei'matplotlib.rcParams["font.size"] = 25matplotlib.rcParams["font.style"]='italic'plt.ylabel("Y轴")plt.plot(x,x)

在这里插入图片描述

方法二

在有中文输出的地方加上fontproperties属性

先来看个例子

import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(10)matplotlib.rcParams["font.size"] = 25matplotlib.rcParams["font.style"]='italic'plt.ylabel("Y轴",fontproperties = 'Kaiti')plt.plot(x,x)

在这里插入图片描述

这样做的好处在于:比如上面这个例子fontproperties只会对ylabel起作用,别的地方不起作用

三.pyplot的文本显示方法

下面是文本显示相关的函数

在这里插入图片描述
实例:
画出正弦波

import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(-2,2,0.02)plt.axis([-3,3,-2,2])matplotlib.rcParams['axes.unicode_minus'] =Falseplt.ylabel("Y轴:振幅",fontproperties = 'Kaiti',fontsize = 25)plt.xlabel("X轴:时间",fontproperties = 'SimHei',fontsize = 25,color = 'red')plt.grid(True)plt.plot(x,np.cos(2*np.pi*x))

在这里插入图片描述

上面两行代码解释一下

matplotlib.rcParams['axes.unicode_minus'] =False   保证负号显示
plt.grid(True)   显示背景格子

再来个例子:

import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(-2,2,0.02)plt.axis([-3,3,-2,2])matplotlib.rcParams['axes.unicode_minus'] =Falseplt.ylabel("Y轴:振幅",fontproperties = 'Kaiti',fontsize = 25)plt.xlabel("X轴:时间",fontproperties = 'SimHei',fontsize = 25,color = 'red')plt.text(-0.5,1.25,"正弦波",fontproperties = 'SimHei',fontsize=25)plt.title("正弦波 ${\mu = 100}$",fontproperties = 'SimHei',fontsize = 25,color = 'green')  #也可作r"正弦波 ${\mu = 100}$"plt.grid(True)plt.plot(x,np.cos(2*np.pi*x))

上面用到了,十分流行

接下来就是介绍annotate函数
在这里插入图片描述
看例子:

import numpy as npimport matplotlib.pyplot as pltimport matplotlibx = np.arange(-2,2,0.02)plt.axis([-3,3,-2,2])matplotlib.rcParams['axes.unicode_minus'] =Falseplt.ylabel("Y轴:振幅",fontproperties = 'Kaiti',fontsize = 25)plt.xlabel("X轴:时间",fontproperties = 'SimHei',fontsize = 25,color = 'red')plt.annotate(r"$\mu=100$",xy=(0,1.0),xytext=(1,1.5),fontsize=25,fontproperties="Kaiti",arrowprops = dict(facecolor="red",shrink=5,width=2))plt.title("正弦波 ${\mu = 100}$",fontproperties = 'SimHei',fontsize = 25,color = 'green')#也可作r"正弦波 ${\mu = 100}$"plt.grid(True)plt.plot(x,np.cos(2*np.pi*x))

在这里插入图片描述

介绍上面annotate几个参数含义(annotate相当于是text的一个升级版)

r"$\mu=100$":文本内容xy:代表箭头的末端的位置xytext:代表文本的位置(箭头由文本的位置指向末端的位置)arrowprops = dict(facecolor="red",shrink=5,width=2)):facecolor代表箭头颜色,shrink代表箭头长度比例,width代表箭头的宽度

四.复杂子区域的划分

前面介绍了subplot函数,现在介绍下面两个函数

1.subplot2grid()

在这里插入图片描述

该函数的分区编号从0开始

import numpy as npimport matplotlib.pyplot as pltimport matplotlibplt.subplot2grid((3,3),(0,0),colspan=3) #整个区域割分为3行3列,并选中(0,0)编号,并向右扩展使得总跨度为3,下同plt.subplot2grid((3,3),(1,0),colspan=2)plt.subplot2grid((3,3),(2,0))plt.subplot2grid((3,3),(2,1))plt.subplot2grid((3,3),(1,2),rowspan=2)

在这里插入图片描述

2.gridspec.GridSpec()(嵌套分区重点看)

上面的函数每次都要划分3x3比较麻烦,下面这个好点

看代码理解即可
例1.

import matplotlib.pyplot as pltimport matplotlib.gridspec as gridspecgs2 = gridspec.GridSpec(3, 3)gs2.update(left=1, right=1.5, top =1.5,bottom =1,hspace=0.05)ax4 = plt.subplot(gs2[:, :-1])ax5 = plt.subplot(gs2[:-1, -1])ax6 = plt.subplot(gs2[-1, -1])gs3 = gridspec.GridSpec(3, 3)gs3.update(left=1.5, right=2, top =2,bottom =1.5,hspace=0.05)ax4 = plt.subplot(gs3[:, :-1])ax5 = plt.subplot(gs3[:-1, -1])ax6 = plt.subplot(gs3[-1, -1])

在这里插入图片描述

例2.
这个是官方的一个比较好的嵌套例子,在这里讲解一下
先看一下
示例:
相当于一个迭代器,把所有的组合方式全都列出来

import itertoolsa = (1, 2)b = ('A')c = itertools.product(a,repeat=2)for elem in c:    print(elem)

在这里插入图片描述


import itertoolsa = (1, 2)b = ('A')c = itertools.product(a,b,repeat=2)for elem in c:    print(elem)

在这里插入图片描述


再看一下:

例子:
相当于给每一个值赋予一个索引,第二个参数是索引的起始值

list=[1,2,3,4]for index,value in enumerate(list,1):    print("%d,%d"%(index,value))

在这里插入图片描述


再看一下;

例子:

import numpy as npimport matplotlib.pyplot as plt x = np.arange(0, 100) fig = plt.figure() ax1 = fig.add_subplot(221)ax1.plot(x, x) ax2 = fig.add_subplot(222)ax2.plot(x, -x) ax3 = fig.add_subplot(223)ax3.plot(x, x ** 2) ax4 = fig.add_subplot(224)ax4.plot(x, np.log(x)) plt.show()

在这里插入图片描述


正式代码:(看懂就行,有关绘图函数的部分我们不需要太多的关注)

import matplotlib.pyplot as pltimport matplotlib.gridspec as gridspecimport numpy as npfrom itertools import product#相当于返回sin(ax)cos(bx)与sin(cx)cos(dx)def squiggle_xy(a, b, c, d):    i = np.arange(0.0, 2*np.pi, 0.05)    return np.sin(i*a)*np.cos(i*b), np.sin(i*c)*np.cos(i*d)fig = plt.figure(figsize=(3, 3)) # 生成一个窗口,长与宽均为3,单位为英寸,还有一个属性可以指定分辨率,dpi=10,代表每一寸10像素,dpi默认为80# gridspec inside gridspec,割分区域为4行4列一共16块,为外部格子outer_grid = gridspec.GridSpec(4, 4, wspace=0.0, hspace=0.0)for i in range(16):	#获取内部格子    inner_grid = gridspec.GridSpecFromSubplotSpec(3, 3,            subplot_spec=outer_grid[i], wspace=0.0, hspace=0.0)    a = i // 4 + 1 #//表示除的结果取整数部分,/表示把数字当做浮点数除    b = i % 4 + 1    for j, (c, d) in enumerate(product(range(1, 4), repeat=2)):#为了绘制丰富的图形使用到了project,其实我认为没有太大必要,例3会简化更易于理解        ax = fig.add_subplot(inner_grid[j])#        ax.plot(*squiggle_xy(a, b, c, d))        ax.set_xticks([])	#x轴标签设置为空        ax.set_yticks([])	#y轴标签设置为空        fig.add_subplot(ax) #添加子区域,把原来的ax覆盖掉,但不写也没啥,官方有毒all_axes = fig.get_axes() #获取每一个子区域# show only the outside spinesfor ax in all_axes:    for sp in ax.spines.values():#先把所有的线都抹去        sp.set_visible(False)    if ax.is_first_row():        ax.spines['top'].set_visible(True)    if ax.is_last_row():        ax.spines['bottom'].set_visible(True)    if ax.is_first_col():        ax.spines['left'].set_visible(True)    if ax.is_last_col():        ax.spines['right'].set_visible(True)plt.show()

在这里插入图片描述

例3:
在上面代码看懂后我们来自行设计一个,不过不需要让每一个小方格的图形不一样

我们把每个小区域的图形全部设置为 y = x {y=x} y=x

不去边界

#导入模板import matplotlib.pyplot as pltimport numpy as npimport matplotlib.gridspec as gridspec#定义函数y=xdef fun():    x =np.arange(0,3,0.02)    y =x    return x,ydef fun1():    x =np.arange(0,3,0.02)    y =-x+3    return x,yfg = plt.figure(figsize=(4,4))#长宽为4,现在什么也没有,要等会儿加gs_outer = gridspec.GridSpec(4,4,wspace=0,hspace=0)for i in range(16):    inner_grid =  gridspec.GridSpecFromSubplotSpec(3,3,gs_outer[i],wspace=0,hspace=0)    for j in range(9):        ax = fg.add_subplot(inner_grid[j])#加内部子区域即可,他会自动的按照原来的排列加入        if j==3:            ax.plot(*fun1())            ax.set_xticks([])            ax.set_yticks([])        ax.plot(*fun())        ax.set_xticks([])        ax.set_yticks([])all_axes = fg.get_axes()plt.show();

在这里插入图片描述

去边界

#导入模板import matplotlib.pyplot as pltimport numpy as npimport matplotlib.gridspec as gridspec#定义函数y=xdef fun():    x =np.arange(0,3,0.02)    y =x    return x,ydef fun1():    x =np.arange(0,3,0.02)    y =-x+3    return x,yfg = plt.figure(figsize=(4,4))#长宽为4,现在什么也没有,要等会儿加gs_outer = gridspec.GridSpec(4,4,wspace=0,hspace=0)for i in range(16):    inner_grid =  gridspec.GridSpecFromSubplotSpec(3,3,gs_outer[i],wspace=0,hspace=0)    for j in range(9):        ax = fg.add_subplot(inner_grid[j])#加内部子区域即可,他会自动的按照原来的排列加入        if j==3:            ax.plot(*fun1())            ax.set_xticks([])            ax.set_yticks([])        ax.plot(*fun())        ax.set_xticks([])        ax.set_yticks([])all_axes = fg.get_axes()for ax in all_axes:#遍历也是按照加入的顺序    for sp in ax.spines.values():#获取区域的边界对象        sp.set_visible(False)    if ax.is_first_row():#相对于他的上一级区域而言        ax.spines['top'].set_visible(True)    if ax.is_last_row():        ax.spines['bottom'].set_visible(True)    if ax.is_first_col():        ax.spines['left'].set_visible(True)    if ax.is_last_col():        ax.spines['right'].set_visible(True)plt.show();

在这里插入图片描述

现在对于嵌套有了比较好的了解了

转载地址:http://gslzi.baihongyu.com/

你可能感兴趣的文章