开始之前,请配置好python环境,同时检查是否安装了第三方库:matplotlib。
本文是博主的学习笔记,有不足之处还请指出。
1. matplotlib库的介绍
1.1 matplotlib库的介绍
matplotlib库是一个数据可视化的一个第三方库,它包含了过百种图像。它结合matlab的优缺点,在此基础上形成了matplotlib。matplotlib由各种可视化类构成,内部结构复杂。因此,我们可以通过matplotlib的一个命令子库matplotlib.pyplot来调用这些基本功能。
一般,我们引用pyplot子库的方式为:
import matplotlib.pyplot as plt
1.2 牛刀小试
我们先画一个简单的图像:
import matplotlib.pyplot as plt
plt.plot([1,2,3,7,4,2]) # 传入xy轴参数,默认为y轴
plt.ylabel("Grade") # 指定y轴 名称
plt.savefig("test",dpi=600) # 保存图像 默认png格式,其中dpi指图片质量
plt.show() # 展示图片
效果如下:
1.3 pyplot的绘图区域
pyplot通过plt.subplot(nrows,ncols,plot_number)方法来实现在同一画板上画多幅子图。参数介绍如下:
- nrows:横向数量
- ncols:纵向数量
- plot_number:当前子图的区域位置。
如plt.subplot(2,2,3)就是表示将将一个全局绘图区域分成4个子区域,当前子图位于第3个子图位置。当子图数量为个位数时,subplot()内参数可以不用逗号分隔,即subplot(223)。
1.4 pyplot的plot()绘图函数
plot是matplotlib中最主要的绘图函数,其全部参数介绍如下:
plt.plot(x,y,format_string,**kwargs)
- x: x轴的数据,可以是列表或数组,是一个可选参数
- y:y轴的数据,可以是列表或数组,必选。
- **kwargs:可以是第二条曲线的参数,需要注意的是,当绘制多条曲线时,xy参数都必须存在;也可以是color、linestyle、marker等等
下面仔细讲解一下format_string参数:
format_string参数是控制曲线格式的字符串,虽然是可选参数,但是却非常重要。它由颜色字符、风格字符和标记字符组成,可以组合使用。
(1)颜色字符,即控制曲线颜色的字符,由于控制颜色的字符较多,这里就仅列出一些常用的字符:
- b: 蓝色
- g: 绿色
- r: 红色
- k: 黑色
- w: 白色
- y: 黄色
- c: 青绿色
- m: 洋红色
- #000000: 此外还可以使用rgb颜色
(2)风格字符,即控制曲线样式的字符:
- “_”:实线
- “–”: 破折线
- “:”: 虚线
- " ": 无线条
(3)标记字符:即对数据坐标点的标记:
- " .": 点标记
- " ,": 像素标记
- " v": 倒三角标记
- " ^": 上三角标记
- " >": 右三角标记
- " <": 左三角标记
- " 1": 下花三角标记
- " 2": 上花三角标记
- " 3": 左花三角标记
- " 4": 右花三角标记
- " s": 实心方形标记
- " p": 实心五角标记
- " *": 星号标记
- " o": 实心圈标记
- " +": +号标记
- " x": x号标记
- " D": 菱形标记
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(20)
plt.plot(a,a,"r--o",a,a*2,"b:",a,a*3,"y_")
plt.savefig("01",dpi=600)
plt.show()
图像如下:
1.5 pyplot的中文显示
pyplot默认不支持中文显示,因此我们需要对其进行一下代码设置(如果不设置,输出时是一些空心的方形)。
更改字体的方法有两种,我们先来看一下第一种:
(1)通过rcparams更改全局字体
先看一下如果不进行中文设置,会是什么效果,如图
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(20)
plt.plot(a,np.cos(0.02*a))
plt.xlabel("这是中文")
plt.savefig("03",dpi=600)
plt.show()
效果如下:
可以发现,x轴的标志是一个个的方形。接下来我们引入matplotlib的rcparams来设置全局字体属性:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams["font.family"] = "SimHei" # 设置字体为黑体
a = np.arange(20)
plt.plot(a,np.cos(0.02*a))
plt.xlabel("这是中文")
plt.savefig("03",dpi=600)
plt.show()
图像如下:
可以发现,中文可以显示出来了。除了可以设置字体类型,它还有如下属性:
- font.style:字体风格(正常normal或斜体italic)
- font.size: 字体大小
但是,细心观察,无论是x轴的标志还是xy轴的尺度,它们的字体全部都变为了黑体。这对全局来说很不友好,因此,我们可以对显示中文的地方单独进行设置。即第二种方法,如下:
(2)通过fontproperties参数单独设置字体:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
# matplotlib.rcParams["font.family"] = "SimHei" # 设置字体为黑体
a = np.arange(20)
plt.plot(a,np.cos(0.02*a))
plt.xlabel("这是中文",fontproperties="SimHei",fontsize=20)
plt.savefig("03",dpi=600)
plt.show()
图像的输出效果如下:
通过fontproperties参数我们可以方便的对所需文本进行设置,使得绘图更加灵活。
1.6 pyplot的文本显示
文本显示就是为图像添加坐标轴、图例、标题和文本注释等内容,从而使图像更加专业化。同时支持LaTeX语法,使其更加具有专业性。前面我们使用plt.xlabel()来对x轴添加文本标签,就是文本显示函数之一,全部的文本显示标签如下:
- plt.xlabel():对x轴添加文本标签
- plt.ylabel():对y轴添加文本标签
- plt.tilte():对图像添加标题,位于图像上方中间位置
- plt.text():在任意位置添加文本注释
- plt.annotate():在图像中添加带有箭头的注解
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0, 5, 0.02)
plt.plot(a,np.cos(2*np.pi*a), "r--")
plt.xlabel("时间",fontproperties="SimHei",fontsize=18,color="yellow")
plt.ylabel("振幅",fontproperties="SimHei",fontsize=18,color="green")
plt.title(r"正弦波图 $y=cos(2\pi x)$",fontproperties="SimHei",fontsize=26)
plt.text(2,1,r"$\mu=100$",fontsize="15")
plt.axis([-1,6,-2,2]) # x轴坐标尺度
plt.grid(True) # 显示网格
plt.savefig("04",dpi=600)
图像如下:
我们再来看一下plt.annotate()函数,它的参数如下:
- s: 注释文本内容
- xy=arrow_crd: 箭头指向的位置
- xytext=text_crd: 文本所在位置
- arrowprops=dict: 文本属性
我们将上面的实例修改一下:
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0, 5, 0.02)
plt.plot(a,np.cos(2*np.pi*a), "r--")
plt.xlabel("时间",fontproperties="SimHei",fontsize=18,color="yellow")
plt.ylabel("振幅",fontproperties="SimHei",fontsize=18,color="green")
plt.title(r"正弦波图 $y=cos(2\pi x)$",fontproperties="SimHei",fontsize=22)
# plt.text(2,1,r"$\mu=100$",fontsize="15")
plt.annotate(r"$\mu=100$",xy=(2,1),xytext=(3,1.5),arrowprops=dict(facecolor="black",shrink=0.1,width=2))
plt.axis([-1,6,-2,2]) # x轴坐标尺度
plt.grid(True) # 显示网格
plt.savefig("04",dpi=600)
plt.show()
图像如下
1.7 pyplot的子绘图区域
前面我们提到通过subplot函数来绘制多规则的子图区域,但如果我们希望在区域中绘制不规则的图像应该怎样处理呢?这里提供一个plt.subplot2grid()函数,用于设计复杂的子图结构。通过设计网格、选中网格,确定选中的行列并进行延伸扩展从而形成我们想要的区域。其参数如下:
- gridspec:设定网格结构
- curspec: 选定网格初始位置
- colspan: 网格扩展列数(以当前为基准)
- rowspan:网格扩展行数(以当前为基准)
我们借助图像来进行理解:
plt.subplot((4,4)(2,0),colspan=3,rowspan=2)就是把绘图区域分成4*4个区域,然后以第3行第一列子区域(黑色)为基准,扩展2 列1行(灰色),即红色区域为但覆盖前子图区域,如图:
以上方法在绘图时有较为复杂的代码,因此,matplotlib为我们提供了另外一个较为简单的设计复杂子图的库gridspec(),我们通过代码及图像进行讲解;
如图,若要选中灰色及黑色部分作为一个子图区域,我们可以这样做:
import matplotlib.pyplot as plt
from matplotlib import gridspec
gs = gridspec.GridSpec(4,4)
plt.subplot(gs[2:,0:-1])
这非常类似于numpy中二维数组的切片操作。即,在gs二维数组中,我们选择一维中的下标为2及2以后的元素,然后选择二维中下标从0开始至倒数第2个结束的区域。
1.8 关于pyplot基本图表函数
pyplot的基本图表函数有很多很多种,而这些图表有的非常常用、有的很少用到(需要注意的是,少用不等于不重要)。在接下来的内容中博主仅简单介绍部分常用的图表,如若想了解更多的基本图表,可以去matplotlib的官网进行学习。这里提供一下链接:matplotlib官网
1.9 pyplot饼图的绘制
饼图,具有简洁直观的特点,常用于带有百分号的数据。饼图通过plt.pie()绘制:
import matplotlib.pyplot as plt
labels = "a","b","c","d","e","f","g" # 每一块的标签
sizes = [10,20,30,15,15,10,20] # 每一块饼图的尺寸
explode = (0,0.1,0,0.5,0,0.2,0) # 指定哪一块是否突出,以及突出强度
plt.pie(sizes,explode=explode,labels=labels,autopct="%1.1f%%",shadow=True,startangle=90) # autopct 是百分数的显示格式,shadow是否带有阴影 startangle是饼图的起始角度
plt.axis("equal") # 画出图像是正圆形
plt.show()
图像如下:
更多信息请看官方pie()文档
1.10 pyplot直方图的绘制
相信大家对直方图都不陌生,那么直方图应该如何绘制呢,我们先来看一段代码:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
mu = 100
sigma = 200
a = np.random.normal(mu,sigma,size=100)
plt.hist(a,20,histtype="stepfilled",facecolor="b",alpha=0.75)
plt.title("直方图",fontproperties="SimHei")
plt.show()
图像如下:
我们通过numpy生成一个正太分布的数组a,并利用它绘制直方图。我们绘制直方图使用plt.hist()函数,其中a是传入的数据,第二个参数bin是用于控制图像中直方的个数(这里表示共有20个直方),这里个数划分的方法是从数组中选择最大最小两个值,在其范围内均分为bin个区域。每个bin内元素的个数,就是这个直方的高度。
更多信息请看官方hist()文档。
1.11 pyplot散点图的绘制
散点图的绘制我们可以通过plot或scatter,其中scatter散点图的绘制和plot类似。这里不再过多介绍。官方scatter()文档