系列文章目录
matplotlib可视化:基础绘图函数使用【函数功能+案例代码】
matplotlib可视化:基础图像绘制
matplotlib可视化:局部放大折线图+阴影区间绘制【原理+代码】
文章目录
前言
由于毕设写论文需要绘图,记录一下matplotlib学习笔记。
一、matplotlib简介
首先附上官网链接:matplotlib官网链接
下载matplotlib:
pip install matplotlib
Matplotlib 由三个层次结构组成:脚本层、美工层和后端层。
- 脚本层:最顶层,大部分代码都在该层运行,主要负责生成图形与坐标系。
- 美工层:结构中的第二层,提供了绘制图形的元素时的各种功能。例如:绘制标题、轴标签、坐标刻度等。
- 后端层:最底层,定义了三个基本类:FigureCanvas(提供绘图画布);Renderer(提供绘图各种方法);Event(来处理鼠标和键盘事件)
- Figure:画布,包括了所有的元素,比如标题、轴线等;
- Axes:绘图区,绘制2D图像区域。
- Axis:坐标系中的垂直轴与水平轴,包含轴长,轴标签,刻度标签。
- Artist:画布上所有元素都属于 Artist 对象,如文本对象(title、xlabel、ylabel)、Line2D 对象(用于绘制2D图像)等。
二、基础函数用法
2.1 figure图形对象
通过plt.figure创建一个画布对象;函数的参数值如下:
参数 | 说明 |
---|---|
figsize | 指定画布的大小,(宽度,高度),单位为英寸。 |
dpi | 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。 |
facecolor | 背景颜色。 |
edgecolor | 边框颜色。 |
frameon | 是否显示边框。 |
示例如下:
import matplotlib.pyplot as plt
import numpy as np
import math
#数据
x = np.arange(0, math.pi*2, 0.05)
y = np.sin(x)
#创建一个画布对象fig
fig=plt.figure(figsize=(10,10),dpi=100,facecolor='#B6D6F0',edgecolor='black',frameon=True)
"""
# figsize 指定画布的大小,(宽度,高度),单位为英寸。
# dpi 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。
# facecolor 背景颜色。
# edgecolor 边框颜色。
# frameon 是否显示边框。
"""
#绘制坐标轴的范围
#add_axes() 的参数值是一个序列,序列中的 4 个数字分别对应图形的左侧,底部,宽度,和高度,且每个数字必须介于 0 到 1 之间。
ax=fig.add_axes([0.3,0.3,0.5,0.5])
#设置x轴,y轴标签
ax.set_xlabel("angle")
ax.set_ylabel("sin(x)")
#设置图像标题
ax.set_title("y=sin(x)")
#绘制图像
ax.plot(x,y)
#展示图象
plt.show()
2.2 axes类使用
Matplotlib 定义了 axes 类,该类的对象被称为 axes 对象。它指定了一个有数值范围限制的绘图区域。在一个给定的figure中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。
2.2.1 创建axes对象
ax=fig.add_axes([0.1,0.1,0.8,0.8])
将画布的宽、高作为 1 个单位。比如,[ 0.1, 0.1, 0.8, 0.8],它代表着从画布 10% 的位置开始绘制, 宽高是画布的 80%。
2.2.2 axes.legend()绘制图例
axes的legend方法可以绘制图例,方法如下:
ax.legend(labels, loc)
其中,labels 是一个字符串序列,用来指定标签的名称;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 |
举例:
ax.legend(labels = ('tv', 'Smartphone'), loc = 'lower right')
同时可以修改图例的大小:
ax.legend(prop = {'size':6})
还可以自定义图例的位置:(0,0)表示的是图的左下角,坐标的数值表示的是比例。
plt.legend(bbox_to_anchor=(0.3,0.5))
图例的样式也可以调整,默认的图例样式是竖排的。比如我们有两个图例,那么我们设置下面这个为2,就是默认并排展示,而不是并列展示
legend(ncol=2)
2.2.3 axes.plot()绘制图像
plot函数的可选参数主要用于设置线条类型,颜色,标记。
颜色标识 | 颜色类型 | 标记符号 | 标记描述 | 线型 | 线型描述 |
---|---|---|---|---|---|
‘b’ | 蓝色 | ‘.’ | 点标记 | ‘-’ | 实线 |
‘g’ | 绿色 | ‘o’ | 圆圈标记 | ‘–’ | 虚线 |
‘r’ | 红色 | ‘x’ | 'X’标记 | ‘-.’ | 点划线 |
‘c’ | 青色 | ‘H’ | 六角标记 | ‘:’ | 虚线 |
‘m’ | 品红色 | ‘s’ | 正方形标记 | ‘H’ | 六角标记 |
‘y’ | 黄色 | ‘+’ | 加号标记 | ||
‘k’ | 黑色 | ‘D’ | 钻石标记 | ||
‘w’ | 白色 |
对于axes类的方法使用,示例代码如下:
import matplotlib.pyplot as plt
#创建画布
fig=plt.figure(dpi=100)
#创建axes
ax=fig.add_axes([0.1,0.1,0.8,0.8])
#绘图
ax.plot([1,2,3,4],[1,3,6,9],'ro-')
ax.plot([1,2,3,4],[2,5,8,12],'bH-.')
#设置图例
ax.legend(labels=('twitter','weibo'), loc='best')
#设置坐标轴
ax.set_xlabel("time")
ax.set_ylabel("visit")
#设置图像标题
ax.set_title("compare")
#展示图片
plt.show()
同时linestyle参数可以设置线型,linewidth可以设置线宽。
在一个画布里面可以拥有多个ax对象,示例代码如下:
fig=plt.figure(dpi=100)
ax1,ax2=fig.add_axes([0.1,0.1,0.8,0.8]),fig.add_axes([0.58,0.15,0.26,0.26])
#绘制第一个图像
ax1.plot([1,2,3,4],[3,5,7,10],'bD-')
ax1.plot([1,2,3,4],[2,6,8,14],'r+:')
ax1.set_xlabel("time")
ax1.set_ylabel("count")
ax1.set_title("graph-one")
ax1.legend(labels=['line1','line2'],loc='best')
#绘制第二个图象
ax2.plot([1,2,3,4],[3,5,7,10],'rD-')
ax2.plot([1,2,3,4],[2,6,8,14],'b+:')
ax2.set_xlabel("time")
ax2.set_ylabel("count")
ax2.set_title("graph-two")
ax2.legend(labels=['line1','line2'],loc='best')
plt.show()
2.3 绘制子图
2.3.1 subplots()函数
subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象:
fig , ax = plt.subplots(nrows, ncols)
nrows 与 ncols 表示两个整数参数,它们指定子图所占的行数、列数。返回值是一个元组,包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols,且每个 axes 对象均可通过索引值访问(从1开始)。
示例:
import matplotlib.pyplot as plt
import numpy as np
import math
#创建画布和多个子图axes
fig,ax=plt.subplots(2,2)
fig.figsize=(8,6)
#x轴数据
x=np.arange(1,10,1)
#对多个子图进行绘制
ax[0][0].plot(x,np.sin(x))
ax[0][0].set_title("y=sin(x)")
ax[0][1].plot(x,np.cos(x))
ax[0][1].set_title("y=cos(x)")
ax[1][0].plot(x,np.log(x))
ax[1][0].set_title("y=log(x)")
ax[1][1].plot(x,np.exp(x))
ax[1][1].set_title("y=exp(x)")
#展示图像
plt.show()
2.3.2 subplot2grid()函数
subplot2gird() 函数以非等分的形式对画布进行切分,并按照绘图区域的大小来展示最终绘图结果。
plt.subplot2grid(shape, location, rowspan, colspan)
参数含义如下:
- shape:把该参数值规定的网格区域作为绘图区域;
- location:在给定的位置绘制图形,初始位置 (0,0) 表示第1行第1列;
- rowsapan/colspan:这两个参数用来设置让子区跨越几行几列。
import matplotlib.pyplot as plt
import numpy as np
a1 = plt.subplot2grid((3,3),(0,0),colspan=3)
a2 = plt.subplot2grid((3,3),(1,0), rowspan = 2)
a3 = plt.subplot2grid((3,3),(1,1),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()
2.4 网格设置grid()
grid() 方法可以开启或者关闭画布中的网格(即是否显示网格)以及网格的主/次刻度;设置网格的颜色、线型以及线宽等属性。
grid(color='b', ls = '-.', lw = 0.25)
- color:颜色设置
- ls:网格线型设置
- lw:网格线宽度设置
示例代码如下:
import matplotlib.pyplot as plt
import numpy as np
#数据源
x = np.arange(1,11)
#创建画布和子图
fig,ax=plt.subplots(1,3,figsize=(9,3))
#设置子图
ax[0].plot(x,x**2,'bo-')
ax[0].set_title("y=x^2")
ax[0].set_xlabel("x")
ax[0].set_ylabel("x^2")
ax[0].grid(color='b', ls = '-.', lw = 0.25)
ax[1].plot(x,x**3,'rH-.')
ax[1].set_title("y=x^3")
ax[1].set_xlabel("x")
ax[1].set_ylabel("x^3")
ax[1].grid(color='k', ls = '-', lw = 0.15)
ax[2].plot(x,x*2,'mD:')
ax[2].set_title("y=x*2")
ax[2].set_xlabel("x")
ax[2].set_ylabel("x*2")
ax[2].grid(color='r', ls = ':', lw = 0.35)
plt.tight_layout()
plt.show()
2.5 坐标轴设置
2.5.1 对数刻度设置
在数据范围广的时候,往往采用对数刻度,代码如下:
ax.xscale("log")或ax.yscale("log")
示例代码
import matplotlib.pyplot as plt
import numpy as np
#数据
x = np.arange(1,9,1)
#创建画布和子图
fig, ax = plt.subplots(1, 2, figsize=(10,4))
#绘图
ax[0].plot(x,x)
ax[0].set_title("Normal scale")
ax[0].set_xlabel("x axis")
ax[0].set_ylabel("y axis")
ax[1].set_yscale("log")
ax[1].plot(x,x)
ax[1].set_title("Logarithmic scale (y)")
ax[1].set_xlabel("x axis")
ax[1].set_ylabel("y axis")
plt.tight_layout()
plt.show()
2.5.2 坐标轴颜色,线宽设置
通过ax.spines获取坐标轴字典,坐标轴包括4个:上下左右。可以通过set_color,set_linewidth设置颜色和线宽。示例代码如下:
fig = plt.figure()
ax = fig.add_axes([0.2, 0.2, 0.7, 0.7])
ax.spines['bottom'].set_color('red')
ax.spines['left'].set_linewidth(2)
ax.spines['right'].set_color(None)
ax.spines['top'].set_color(None)
ax.plot([1, 2, 3, 4, 5])
plt.show()
2.5.3 坐标轴范围
通过set_xlim,set_ylim实现。
#设置y轴
a1.set_ylim(0,10000)
#设置x轴
a1.set_xlim(0,10)
2.5.4 坐标轴刻度,刻度标签
对于坐标轴的刻度,通过set_xticks或set_yticks实现;对于坐标轴的刻度标签,在设置好坐标轴刻度的前提下,将标签与刻度一一对应,采用set_xticklabels或set_yticklabels进行设置。示例代码如下:
#数据
x = np.arange(0, math.pi * 2, 0.05)
#生成画布对象
fig = plt.figure()
# 添加绘图区域
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
#绘图
ax.plot(x, np.sin(x))
#设置x轴标签
ax.set_xticks([0, 2, 4, 6])
# 设置x轴刻度标签
ax.set_xticklabels(['zero', 'two', 'four', 'six'])
# 设置y轴刻度
ax.set_yticks([-1, 0, 1])
plt.show()
同时,通过plt.tick_params(labelsize=7)可以设置标签刻度的字体大小。
或者plt.tick_params(‘y’,labelcolor=“#1111FF”)可以设置标签的颜色和更改坐标轴类型。
2.6 字体设置问题
一般论文采用中文宋体和英文Times New Roman字体,参考博客:字体设置进行了字体设置。
【方法一】
def draw01():
plt.rcParams['font.sans-serif'] = ['SongNTR'] ##设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
year = [2017, 2018, 2019, 2020]
people = [20, 40, 60, 70]
#生成图表
plt.plot(year, people)
plt.xlabel('年份')
plt.ylabel('人口')
plt.title('人口增长-1')
#设置纵坐标刻度
plt.yticks([0, 20, 40, 60, 80])
#显示图表
plt.show()
【方法二】
def draw02():
plt.rcParams['font.sans-serif'] = ['Times New Roman']
plt.rcParams['axes.unicode_minus'] = False
year = [2017, 2018, 2019, 2020]
people = [20, 40, 60, 70]
#生成图表
plt.plot(year, people)
plt.xlabel('年份',fontproperties='simsun')
plt.ylabel('人口',fontproperties='simsun')
plt.title('人口增长-2',fontproperties='simsun')
#设置纵坐标刻度
plt.yticks([0, 20, 40, 60, 80])
#显示图表
plt.show()
2.7 文本和箭头设置
2.7.1 文本设置
Axes.text(x, y, s, fontdict=None, **kwargs)
参数:
- x,y:文本位置,以数据坐标形式展示。
- s:文本内容
- fontdict:字体相关设置
【举例】
可以指定以坐标轴坐标表示的文本((0,0)为左下,(1,1)为右上角)。下面的例子将文本放在坐标轴的中心
text(0.5, 0.5, 'matplotlib', horizontalalignment='center',
verticalalignment='center', transform=ax.transAxes,color='r')
transform=ax.transAxes可以让文字的位置坐标针对于坐标轴的相对比例进行定位,color可以修改文本颜色
2.7.2 箭头设置
Axes.arrow(x, y, dx, dy, **kwargs)
增加一个箭头,从(x, y) 到(x+dx, y+dy)
参数:
- width:设置箭头尾部宽度
- head_width:设置箭头头部宽度
- shape:{‘full’, ‘left’, ‘right’},default: ‘full’
举例:
ax.arrow(0.1,0.7,0,0.15,shape='full',width=0.025,head_width=0.05,fc="#FF2727",alpha=0.5,ec=None,linewidth=0)