1.Matplotlib简介
Matplotlib是python数据分析三剑客之一,是一个功能强大且非常流行的Python数据可视化库。Matplotlib可用于绘制折线图(line plot)、散点图(scatter plot)、条形图(bar plot)、直方图(histogram plot)、饼图(pie plot)等,同时也支持部分3D绘图功能。正所谓“一图胜千言”,通过图像,可以更加清晰、直观地展示数据,从而有利于数据分析。
2.Matplotlib图像主要组成部分
Matplotlib图像的主要组成部分包括:
-
画布(figure):画布是所有绘制元素的顶级容器,可将其视为一张白纸,供我们后期创作;
-
轴域(axes):轴域是图中绘制数据的矩形区域,每个画布可以包含一个或多个轴,轴提供坐标系;
-
标题(title):标题是一个文本元素,通常用于提供所绘图像的信息;
-
轴标签(x label,y label):标签是为 x 轴和 y 轴提供描述的文本元素,用于提供单位或其他相关信息;
-
图例(legend):图例用于指示图中不同元素的含义;
-
网格线(grid):网格线用于帮助读者对齐刻度线,从而更准确地读取数据点的位置和值。
3.绘图示例
3.1 创建空白画布
plt.figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True)
-
num:画布编号,默认值为1;
-
figsize:指定画布宽高,默认为(6.4,4.8);
-
dpi:图像分辨率,单位为pixel/inch,默认值为80;
-
facecolor:背景颜色,默认值为白色;
-
edgecolor:边框颜色;
-
frameon:是否显示边框,默认显示。
import numpy as np
from matplotlib import pyplot as plt
fig=plt.figure(figsize=(8,6),dpi=100,facecolor='c') # 创建一个尺寸为(8,6),分辨率为100dpi,背景色为青色的画布
plt.show()
3.2 折线图
折线图(line plot)将数据中相邻的点用直线连接起来,当点分布得很密时,连接起来的线变得光滑。下面展示了y=x^2(x∈[-5,5])的三个图像,左图在x∈[-5,5]中均匀地分布了5个点,点与点之间用直线连接起来,可以很明显地看出折线图的属性;右图在x∈[-5,5]中均匀地分布了20个点,此时折线变得较为光滑,但细看还是可以看出折线的痕迹;下图在x∈[-5,5]中均匀地分布了200个点,此时折线变得非常光滑,肉眼已无法观察到折线的痕迹。
plt.plot(x,y,*args)
主要设置参数有:color(c,颜色)、linestyle(ls,线型)、marker(点标记)、linewidth(lw,线宽),markersize(标记大小)、markerfacecolor(mfc,标记填充色),label(标签,与图例配合使用)、alpha(透明度,取值为0-1,0为完全透明,1为完全不透明)等。
其中主要颜色有:
r(red) | 红色 |
b(blue) | 蓝色 |
g(green) | 绿色 |
y(yellow) | 黄色 |
k(black) | 黑色 |
w(white) | 白色 |
c(cyan) | 青色 |
m(magenta) | 洋红色 |
此外,还支持十六进制的RGB色号,如:
主要线型有:
- | solid |
-- | dashed |
-. | dashdot |
: | dotted |
主要点标记有:
marker | description | marker | description |
"." | point | "," | pixel |
"o" | circle | "v" | triangle_down |
"^" | triangle_up | "<" | triangle_left |
">" | triangle_right | "1" | tri_down |
"2" | tri_up | "3" | tri_left |
"4" | tri_right | "8" | octagon |
"s" | square | "p" | pentagon |
"P" | plus (filled) | "*" | star |
"h" | hexagon1 | "H" | hexagon2 |
"+" | plus | "x" | x |
"X" | x (filled) | "D" | diamond |
"d" | thin_diamond | "|" | vline |
"_" | hline |
其样式如下:
一个简单的例子:
fig=plt.figure() # 全部用默认值
x=[1,2,3,4,5]
y=[2,1,3,5,4]
plt.plot(x,y,color='#A7D676',linestyle='--',marker='*',markerfacecolor='b',markersize=15)
plt.show() # 每次调用plt.show()方法后,会将所有绘图元素释放出来,所以对元素的修改应该在该方法之前
基本的元素有了,我们还希望再给图增加点元素,使得读者能见图知意,如增加标题,轴标签等。
添加标题:
plt.title(label,*args)
常用参数包括:color(c,颜色)、fontsize(标题字号)。
添加轴标签:
plt.xlabel(xlabel,*args) 、plt.ylabel(ylabel,*args)
常用参数包括:color、fontsize、loc(标签位置,x轴标签位置一般为'center'或'right',y轴标签位置一般为'center'或'top')、rotation(旋转角度)等。
添加网格线:
plt.grid(*args)
常用参数包括:color、linestyle、axis('x'、'y'或'both',默认为'both',即希望哪个轴显示网格线)、alpha。
x=np.linspace(0,2*np.pi,200) # 点密集后,折线图会变得光滑
y=np.sin(x)
fig=plt.figure()
plt.plot(x,y,linestyle='-',color='c')
plt.title('Line Plot',fontsize=18)
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top',rotation=0)
plt.grid(axis='y',linestyle='--',color='k',alpha=0.5) # 只显示y轴网格线
plt.show()
3.3 双线图
对于同一个轴域,可以通过多次调用plt.plot(x,y,*args),在坐标系中绘制多条线,再通过plt.show()展示图像,双线图只是一个示例。
为了使得读者清晰理解每条线的意义,可以为每条线添加label(标签),再配合图例说明。
添加图例:
plt.legend(*args)
常用参数为:loc,默认值为'best',即自动地寻找最合适的位置,其余值含义如下表:
value | location |
0 | 'best |
1 | 'upper right' |
2 | 'upper left' |
3 | 'lower left' |
4 | 'lower right' |
5 | 'right' |
6 | 'center left' |
7 | 'center right' |
8 | 'lower center' |
9 | 'upper center' |
10 | 'center' |
同时,还可以使用plt.xticks(ticks,labels,*args)、plt.yticks(ticks,labels,*args)来改变刻度显示,其中ticks表示要显示的刻度值 ,labels表示对应刻度需要显示的标签。如,我们希望刻度[1,2,3]对应的位置显示['Alice','Bob','Clark']。
x=np.linspace(0,2*np.pi,200)
y1=np.sin(x)
y2=np.cos(x)
fig=plt.figure()
plt.plot(x,y1,linestyle='-',color='c',label='y=sin(x)') # 该线标记为y=sin(x)
plt.plot(x,y2,linestyle='--',color='m',label='y=cos(x)') # 该线标记为y=cos(x)
plt.title('y=sin(x) and y=cos(x)')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top',rotation=0)
x_ticks=np.linspace(0,2*np.pi,5)
x_ticks_labels=['0','π/2','π','3π/2','2π']
y_ticks=np.linspace(-1,1,5)
plt.xticks(x_ticks,x_ticks_labels,c='g')
plt.yticks(y_ticks)
plt.legend(loc='best')
plt.grid(linestyle='--',axis='y',alpha=0.5)
plt.show()
3.4 双y轴图
Matplotlib是一个非常强大的绘图库,语法非常灵活,但是这种灵活有时也会给我们带来很大的困扰,因为我们总是希望事情按照某一个固定的模版来进行,但Matplotlib往往达成同一目的的路径有很多条,比如颜色形参可以写成color,也可以写成c。之前的例子中我们总是在创建一个画布之后用plt方法绘图,这其实是在这个画布上隐式生成了一个绘图区域。对于简单图像而言,这种方法较为简便,但绘制复杂图像时,则需要用到轴域(ax)概念才可以更加精准地画出我们需要的图像。如:
fig=plt.figure()
ax=fig.add_axes([left,bottom,width,height]) # 向画布上添加一个轴域,四个参数的取值均为0-1,
ax.plot() # left、bottom表示轴域偏离画布左侧、底部的百分比
plt.show() # width、height表示轴域宽度、高度占画布的比例
或:
fig,ax=plt.subplots() # 用该方法返回一个画布对象、一个轴域对象
ax.plot()
plt.show()
此外还有其他创建方法,这方面只有多看、多练。
x1=np.linspace(0,10,200)
y1=np.exp(x1)
x2=np.linspace(0.001,10,200)
y2=np.log(x2)
fig=plt.figure()
ax1=fig.add_subplot()
ax1.plot(x1,y1,linestyle='-.',color='b',alpha=0.8,label='y=e^x')
ax1.tick_params(axis='y',labelcolor='b') # 将对应的y轴刻度标签改为对应颜色
ax2=ax1.twinx()
ax2.plot(x2,y2,linestyle=':',color='g',alpha=0.8,label='y=ln(x)')
ax2.tick_params(axis='y',labelcolor='g') # 将对应的y轴刻度标签改为对应颜色
plt.title('y=e^x and y=ln(x)')
plt.show()
3.5 多子图
多子图可由以下两种方式绘制。
方式一:
fig=plt.figure(facecolor='lightblue')x1=np.linspace(0,2*np.pi,200)
y1=np.sin(x1)
plt.subplot(2,2,1) # 一共2×2个子图,此为第一个
plt.plot(x1,y1,linestyle='-',color='b',label='y=sin(x)')
plt.title('y=sin(x)')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')
plt.grid(alpha=0.8)
x_ticks=np.linspace(0,2*np.pi,5)
x_labels=['0','π/2','π','3π/2','2π']
plt.xticks(x_ticks,x_labels)
plt.yticks(np.linspace(-1,1,5))x2=np.linspace(0,2*np.pi,200)
y2=np.cos(x2)
plt.subplot(2,2,2) # 一共2×2个子图,此为第二个
plt.plot(x2,y2,linestyle='--',color='g',label='y=cos(x)')
plt.title('y=cos(x)')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')
plt.grid(axis='y',alpha=0.5)
plt.xticks(x_ticks,x_labels)
plt.yticks(np.linspace(-1,1,5))x3=np.linspace(0,10,200)
y3=np.exp(x3)
plt.subplot(2,2,3) # 一共2×2个子图,此为第三个
plt.plot(x3,y3,linestyle='-.',color='orange',alpha=0.7,label='y=e^x')
plt.title('y=e^x')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')x4=np.linspace(0.01,10,200)
y4=np.log10(x4)
plt.subplot(2,2,4) # 一共2×2个子图,此为第四个
plt.plot(x4,y4,linestyle=':',color='r',alpha=0.6,label='y=lg(x)')
plt.title('y=lg(x)')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')plt.tight_layout() # 自动调整布局(紧凑布局)
plt.show()
方式二:
fig,ax=plt.subplots(2,2) # 这种创建方式会返回fig、ax两个对象,其中ax是一个轴域列表,形状与子图的形状一致
ax1,ax2,ax3,ax4=ax.flatten() # 可以将列表展平后逐个取出x1=np.linspace(0,2*np.pi,200)
y1=np.sin(x1)
ax1.plot(x1,y1,label='y=sin(x)')
ax1.set_title('y=sin(x)')x2=np.linspace(0,2*np.pi,200)
y2=np.cos(x2)
ax2.plot(x2,y2,label='y=cos(x)')
ax2.set_title('y=cos(x)')x3=np.linspace(0,10,200)
y3=np.exp(x3)
ax3.plot(x3,y3,label='y=e^x')
ax3.set_title('y=e^x')x4=np.linspace(-5,5,200)
y4=np.power(x4,2)
ax4.plot(x4,y4,label='y=x^2')
ax4.set_title('y=x^2')plt.tight_layout()
plt.show()
3.6 多轴域图
fig=plt.figure()
x1=np.linspace(0,2*np.pi,200)
y1=np.sin(x1)
plt.plot(x1,y1)
plt.title('y=sin(x)')
x2=np.linspace(0,2*np.pi,200)
y2=np.cos(x2)
ax2=fig.add_axes([0.58,0.55,0.25,0.25])
ax2.set_title('y=cos(x)') # 用轴域绘图时设置标签等方法一般在前面加set
ax2.plot(x2,y2) # 如ax.set_xticks()、ax.set_title()等
plt.show()
3.7 条形图
plt.bar(x,y,*args)
常用参数为:color(可以以列表的形式指定每一个柱子的颜色)、width(宽度,取值为0-1)、bottom(可以理解为y坐标偏移量)。
x=np.arange(1,6)
y=np.random.randint(60,100,5)
fig=plt.figure()
plt.bar(x,y,color=['c','m','r','g','b'],width=0.5,alpha=0.5)
plt.title('Revenue-Month Plot')
plt.xlabel('month',loc='right')
plt.ylabel('revenue',loc='top')
plt.show()
3.8 簇状条形图
在条形图的基础上,可以将x坐标与宽度参数配合起来,绘制簇状条形图。
x=np.arange(1,6)
x_labels=['Jan','Feb','Mar','Apr','May']
data_Tom=np.random.randint(60,100,size=5)
data_Jack=np.random.randint(60,100,size=5)
data_Wilson=np.random.randint(60,100,size=5)
fig=plt.figure()
width=0.3
plt.bar(x-width,data_Tom,color='#D98481',width=width,label='Tom')
plt.bar(x,data_Jack,color='#91B5A9',width=width,label='Jack')
plt.bar(x+width,data_Wilson,color='#EDCA7F',width=width,label='Wilson')
plt.title('Revenue-Month Plot')
plt.xlabel('Month',loc='right')
plt.ylabel('Revenue',loc='top')
plt.xticks(x,x_labels)
plt.legend(loc='best')
plt.show()
3.9 堆叠图
在条形图的基础上, 可以将y坐标与bottom参数配合起来,绘制堆叠图。
x=np.arange(4)
x_labels=['Tom','Jack','Mike','John']
data_Jan=np.random.randint(60,100,size=4)
data_Feb=np.random.randint(60,100,size=4)
data_Mar=np.random.randint(60,100,size=4)
fig=plt.figure()
plt.bar(x,data_Jan,color='#D98481',label='Jan')
plt.bar(x,data_Feb,color='#91B5A9',bottom=data_Jan,label='Feb')
plt.bar(x,data_Mar,color='#EDCA7F',bottom=data_Jan+data_Feb,label='Mar')
plt.title('Revenue-Staff Plot')
plt.xticks(x,x_labels)
plt.xlabel('Staff',loc='right')
plt.ylabel('Revenue',loc='top')
plt.legend(loc='best')
plt.show()
3.10 横向条形图
横向条形图与普通条形图的主要差别在于方向不同。
x=np.arange(5)
y=np.random.randint(50,100,size=5)
fig=plt.figure()
plt.barh(x,y,color=['b','g','r','c','m'],alpha=0.5)
plt.title('Horizontal Bar Plot')
plt.xlabel('y',loc='right')
plt.ylabel('x',loc='top')
plt.show()
3.11 面积图
面积图与折线图类似,但面积图会将折线与x轴之间的区域填充颜色。
plt.stackplot(x,y,*args)
常用参数有:color、alpha。
x=np.arange(10)
y=np.random.randint(50,100,size=10)
fig=plt.figure()
plt.stackplot(x,y,color='c',alpha=0.5)
plt.title('Area Plot')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')
plt.show()
3.12 填充
填充可以将两条线之间的区域填充上颜色,在绘制曲线包络等场景下可发挥作用。
plt.fill_between(x,y1,y2,*args)
常用参数有:color、alpha等。
x=np.linspace(0,100,2000)
y=np.sin(x)*np.exp(-0.1*x)
y1=np.exp(-0.1*x)
y2=-np.exp(-0.1*x)
fig=plt.figure()
plt.plot(x,y,color='c')
plt.title('y=sin(x)·e^(-0.1x)')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')
plt.fill_between(x,y1,y2,color='y',alpha=0.4)
plt.show()
3.13 散点图
散点图与折线图的区别在于,散点图不会将点与点之间用直线连接起来。
plt.scatter(x,y,*args)
常用参数有:color、marker(标记样式)、linewidth(线宽)、edgecolor(边缘颜色)、s(点大小)、alpha等。
x=np.arange(10)
y=np.random.randn(10)
fig=plt.figure()
plt.scatter(x,y,color='lightblue',marker='*',linewidth=0.5,edgecolor='b',s=100)
plt.title('Scatter Plot')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')
plt.show()
3.14 泡泡图
在散点图的基础上,可以通过生成一个随机数组来指定每个点的大小,同时点的颜色的指定可以用color、cmap(颜色映射)这两个参数来配合,其中color参数为一个数组,cmap为一种指定的配色方案,在这种方式下,color数组中的每个数值被映射为一种颜色,根据不同的数值可以为每个点指定不同的颜色。这种情况下绘制出来的散点图形似一个个泡泡,故称泡泡图(bubble plot)。
cmap |
viridis |
rainbow |
Blues |
summer |
autumn |
cool |
··· |
x=np.random.rand(100)
y=np.random.randn(100)
s=np.random.rand(100) # 随机指定点的大小
c=np.random.rand(100) # 随机指定点颜色的映射值
fig=plt.figure()
plt.scatter(x,y,s=s*500,c=c,cmap='rainbow',alpha=0.8)
plt.title('Bubble Plot')
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')
plt.show()
3.15 直方图
直方图用来表示数据的分布情况,直方图中每一个柱子的高度表示分布在该组中的数据的个数。
plt.hist(data,*args)
常用参数包括:color、bins(分组,可以为一个整数,即要把数据分为几组;也可以为一个列表,如[10,20,30,40],则会把数据分为[10,20)、[20,30)、[30,40)三组,直方图统计分布在这三组中的数据个数)。
data=np.random.randn(1000)
fig=plt.figure()
plt.hist(data,bins=10,color='lightblue')
plt.title('Histogram Plot')
plt.show()
3.16 饼图
饼图(pie plot)用来表示每个数据在其组内的占比。
plt.pie(data,*args)
常用参数有:color、labels(每个扇形的标签)、explode(取值为0-1,用来指定每个扇形突出的程度)、shadow(阴影,增加立体感)、autopct(显示百分比)、pctdistance(百分比距离圆心的程度,一般取值为0-1)、labeldistance(标签距离圆心的程度,一般取值为一大于1的值)、radius(扇形半径)、wedgeprops(楔子的属性,为一字典,包括了edgecolor、width等属性)。
data=np.random.randint(50,100,size=5)
labels=['Alice','Bob','Tom','Jack','Mike']
explode=[0,0,0.1,0,0]
fig=plt.figure()
plt.pie(data,labels=labels,colors=['#B1D5E4','#DB7777','#5EB376','#929FC8','#DC7F68'],autopct='%1.1f%%',shadow=True,explode=explode,pctdistance=0.5,labeldistance=1.1,wedgeprops={'edgecolor':'w','width':1})
# autopct='%1.1f%%'表示百分比保留一位小数,若autopct='%1.2f%%'则百分比保留两位小数
plt.title('Pie Plot')
plt.show()
3.17 环形图
在饼图的基础上,可以通过改变楔子的宽度获得环形图,也叫甜甜圈图(donut chart)。
data=np.random.randint(50,100,size=5)
labels=['Alice','Tom','Jack','Mike','Tony']
fig=plt.figure()
plt.pie(data,labels=labels,colors=['#B1D5E4','#DB7777','#5EB376','#929FC8','#DC7F68'],autopct='%1.1f%%',wedgeprops={'width':0.5,'edgecolor':'w'},pctdistance=0.7)
plt.title('Donut Chart')
plt.show()
3.18 嵌套饼图
在饼图的基础上,通过控制饼图半径(radius)、环形图的楔子宽度(width),使得在同一画布上展示一个饼图+一个环形图。
data1=np.random.randint(50,100,size=5)
data2=np.random.randint(50,100,size=5)
fig=plt.figure()
plt.pie(data1,colors=['#B1D5E4','#DB7777','#5EB376','#929FC8','#DC7F68'],wedgeprops={'width':0.5,'edgecolor':'w'})
plt.pie(data2,colors=['#7DBFB4','#E1BE54','#B2516B','#2E8391','#CDA4BF'],radius=0.4)
plt.show()
3.19 箱型图
箱型图(box plot)是数据分析领域常用的一种统计图,用于描述数据的分散程度,箱型图可以直观地反映出一组数据的最大值、最小值、中位数、及上下四分位数。
plt(data,*args)
data=np.random.randn(100)
fig=plt.figure()
plt.boxplot(data)
plt.title('Box Plot')
plt.show()
3.20 等高线图
等高线(countour lines)图可以将三维数据使用二维的方法可视化。z=f(x,y),即二维平面上的每一个点(x,y)对应一个值z,等高线即二维坐标平面上高度相等的相邻各点所连成的闭合曲线。
绘制等高线图有plt.contour(x,y,z,*args)、plt.contourf(x,y,z,*args)两个函数,差别在于plt.contourf会对等高线间的区域进行填充。
常用参数有:levels(可以为一整数,表示需要显示的等高线条数;也可以为一列表,表示需要显示的等高线的数值)、cmap。
为进一步完善等高线图,plt.contour(x,y,z,*args)、plt.contourf(x,y,z,*args)函数常与plt.clabel(contour,*args)函数配合,为每一条等高线添加数值标签,该函数的常用参数有inline(取值为'True'或'False',表示是否将数值标签嵌入等高线内显示)、fontsize。
x=np.linspace(-5,5,200)
y=np.linspace(-5,5,200)
X,Y=np.meshgrid(x,y)
Z=X**2+Y**2
fig=plt.figure()
contour=plt.contour(X,Y,Z,levels=10,cmap='rainbow')
plt.clabel(contour,inline='True',fontsize=8)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Contour Plot')
plt.show()
对于使用颜色映射(cmap)的图,还可以调用plt.colorbar()方法显示数值-颜色映射关系。
x=np.linspace(-5,5,200)
y=np.linspace(-5,5,200)
X,Y=np.meshgrid(x,y)
Z=np.sin(np.sqrt(X**2+Y**2))
fig=plt.figure()
plt.contourf(X,Y,Z,cmap='viridis')
plt.colorbar()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Contourf Plot')
plt.show()
3.21 极坐标图
Matplotlib支持极坐标系,只需在创建子图时将projection指定为'polar'。
fig=plt.figure()
ax=fig.add_subplot(projection='polar')
x=np.linspace(0,2*np.pi,5)
y=np.random.randint(60,100,size=5)
ax.plot(x,y)
plt.title('Polar Plot')
plt.show()
3.22 雷达图
在极坐标图的基础上,只需将起始点和终点连接起来,再将折线与极点间的区域填充上颜色,就可以得到雷达图。
fig=plt.figure()
ax=fig.add_subplot(projection='polar')
x_0=np.linspace(0,2*np.pi,7)
x=np.hstack((x_0,x_0[0])) # 这一步是为了将起始点和终止点连接起来
y_0=np.full(shape=7,fill_value=100)
y=np.hstack((y_0,y_0[0])) # 这一步是为了将起始点和终止点连接起来
ax.plot(x,y,color='#7DBFB4')
ax.fill_between(x,y,0,color='lightblue',alpha=0.8)
x_ticks=np.linspace(0,5*np.pi/3,6)
x_labels=['power','experience','speed','defence','service','skills']
ax.set_xticks(x_ticks,x_labels,color='#B2516B')
ax.set_yticks([]) # 关闭y轴刻度
plt.title('Ma Long')
plt.show()
3.23 文本注释
为进一步增加图像的可读性,可为图像添加文字注释。
plt.text(x,y,s,*args),(x,y)表示文本显示的坐标,s表示文本内容。
常用参数包括:ha(文本的水平对齐方式,一般为'center'、'left'、'right')、va(文本的垂直对齐方式,一般为'center'、'top'、'bottom')、fontsize。
x=np.arange(1,6)
x_label=['Alex','Bruce','Derrick','Eric','Frank']
color=['b','g','c','m','r']
y=np.random.randint(60,100,size=5)
fig=plt.figure()
plt.bar(x,y,color=color,alpha=0.5)
plt.xticks(x,x_label)
plt.title('Bar Plot')
for (a,b) in zip(x,y):plt.text(x=a,y=b,s=b,ha='center',va='bottom')
plt.show()
3.24 标注
与文本注释的区别在于,该函数可以绘制一个箭头指向被标注的对象。
plt.annotate(text,xy,xytext,arrowprops,*args),text表示需要显示的文本,xy为一个元组,表示箭头指向的对象的坐标,xytext为一个元组,表示文本放置的坐标,arrowprops (箭头的属性,为一字典,包括了color、width、headwidth等属性)。
x=np.linspace(0,2*np.pi,200)
y=np.sin(x)
fig=plt.figure()
plt.plot(x,y,c='lightblue')
plt.xlim([-1,8])
plt.ylim([-2,2])
# plt.xlim([low,high])、plt.ylim([low,high])表示显示的x、y轴的范围
# 以上函数等效于plt.axis([-1,8,-2,2])
plt.xlabel('x',loc='right')
plt.ylabel('y',loc='top')
plt.title('y=sin(x)')
plt.annotate(text='maximum',xy=(np.pi/2,1),c='#DB7777',xytext=(0.5+np.pi/2,1.5),arrowprops={'width':0.5,'headwidth':3,'color':'#2E8391'})
plt.annotate(text='minimum',xy=(3*np.pi/2,-1),c='#DB7777',xytext=(0.5+3*np.pi/2,-1.5),arrowprops={'width':0.5,'headwidth':3,'color':'#7DBFB4'})
plt.show()
4.参考资料
- 《千锋教育python数据分析教程200集,Python数据分析师入门必备视频》
- Python学习之-matplotlib详解-CSDN博客
- Matplotlib | 一文搞定Matplotlib从入门到实战演练!-CSDN博客