在matplot中,整幅图像为一个figure对象,在figure对象中包含一个或者多个axes对象,,每个axes对象都是一个拥有自己坐标系统的绘图区域。关系如下:
图形的组成结构如下:
画图流程:
开始->创建画图figure->创建子图fig1,axes->画线->设置标题title->设置图例legend->设置坐标轴->设置网格->注释及刻度->结束
1、创建图形:f=plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=Trye)
num: 图像编号
figsize:(width, height),以英寸为单位
dpi: 分辨率,每英寸多少像素
facecolor: 背景颜色
edgecolor: 边框颜色
frameon: 是否有边框
2、创建子图
subplot创建单个子图:
#有两种方式
#方式一:借助plt创建
plt.subplot(2,2,1)
plt.plot(x,x)
#方式二:借助总图返回的对象f创建
f.add_subplot(2,2,1)
subplots创建多个子图:
fig,axes=plt.subplots(2,2)
ax1=axes[0,0]
ax2=axes[0,1]
ax3=axes[1,0]
ax4=axes[1,1]
ax1.plot(x,x)
上面返回的都是axes对象,可以通过指定哪一行和哪一列任意排列axes位置,通过[x,y,width,height],这四个值都是相对取值的,在0-1之间,前面两个以左下角为基准,后面两个相对于整个figure对象的宽度和高度。
#同样有两种方式
#方式一:通过plt创建
plt.axes([0.1,0.1,0.8,0.8])
#方式二:通过借助总图所返回的对象f创建
f.add_axes([0.1,0.1,0.8,0.8])
3、画线
#colors=['red','blue','orange']
plt.plot(x,y,c=colors[i],label=str(i))
4、标题 plt.title('谢芬芬')
5、图例
plt.legend(handles=[l1, l2], labels=['up', 'down'], loc='lower right')
6、坐标轴
#显示范围
fig1.axis([xmin,xmax,ymin,ymax])
plt.axis([xmin,xmax,ymin,ymax])
#分别设置x、y轴的显示范围
fig1.set_xlim(2,4) fig1.set_ylim(2,4)
plt.xlim(2,4) Plt.ylim(2,4)
#设置刻度
plt.yticks([-1,-1/2,0,1/2,1])
fig1.set_yticks([-1,-1/2,0,1/2,1])
fig1.xaxis.set_ticks([1,2,3,4,5,6,7,8])
#上述两种方法只能设置数字刻度,此方法可用字符串,字旋转45度
plt.xticks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi],['aaa','bbb','ccc','ddd','eee'],fontsize=‘xx-large’,rotation=45)
# 若要显示π、α等一些特殊的数学符号
plt.xticks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi],['$0$','$\pi/2$','$\pi$','$3\pi/2$','$2\pi$'],fontsize=‘xx-large’)
#关闭坐标轴
plt.axis('off')
#坐标轴不可见
fig.get_xaxis().set_visible(False) #不显示x轴
fig.get_yaxis().set_visible(False)
7、网格 plt.grid()
8、显示 plt.show()
1、多幅图出现图像部分重叠
采用: fig.tight_layout(pad=None,w_pad=None,h_pad=None)
参数:
pad: 设置绘图区边缘与画布边缘的距离大小
w_pad: 设置绘图区之间的水平距离大小
h_pad: 设置绘图区之间的垂直距离大小
使得子图横纵坐标更加紧凑,主要用于自动调整图区的大小及间距,使得所有绘图及其标题、坐标轴标签都不重叠
2、plt.subplot(5,5,x),x要从1开始,不能从0,否则会出现ValueError: num must be 1 <= num <= 25
for i in range(25):
plt.subplot(5, 5, 1+i)