整理记录一下使用proplot进行绘图过程的一些小技巧
1、创建画板,非投影转换
f, axs = pplt.subplots( ncols=1, nrows=1, yreverse=True, share =1, figsize=(8,6) ) 创建一个1x1的子图 ncols代表列 nrows代表行 yreverse=True 表示翻转y轴,与matplotlib.pyplot中的ax.invert_yaxis()作用相同 share=1,2,3,4,False 表示共享横轴、纵轴、colorbar、标题等信息,False表示不共享 figsize :设置画板的大小,可以根据需要设置,不添加的话是系统默认的格式
2、创建画板,含投影
f, ax = pplt.subplots( ncols=1, nrows=1, axwidth=5, refwidth=2, suptitle='subplot ', # figsize=(5,4), proj='cyl', proj_kw={'lon_0': 180}, lonlim=(100, 200), latlim=(-20, 20), share=4, ) 与matplotlib.pyplot的创建方式的区别,投影可以直接在创建画板时设置。 axwidth :调节画板的清晰度,可能,没怎么用过 refwidth: 各子图的长宽比 suptitle:各子图的总标题 proj='cyl', 设置为等间距投影 proj_kw={'lon_0': 180}, lonlim=(100, 200), latlim=(-20, 20), 表示设置中心经度为180°,地图的经度范围是:100E-200E, 纬度范围是:-20S-20N
3、填色图的命令
m=ax.contourf(lon,lat,pre, colorbar='l', cmap = cmap, extend='both', colors=[ 'blue9','blue6','blue4', 'blue2','blue0', 'white','white', 'yellow3','yellow6', 'orange7', 'red8','red9' ], colorbar_kw={'label': '', 'lw':0.5}, levels = np.linspace(-30,30,31) ) 基本的命令和matplot.pyplot类似,多了一些额外的功能 colorbar='l' :设置colorbar的显示位置,可以直接在contourf()里面设置了 extend='both':设置色标两边的范围为延申形式,没有定死 lw=0.7 :如果是绘制等值线的话,可以控制线的粗细 colors=[ 'blue9','blue6','blue4', 'blue2','blue0', 'white','white', 'yellow3','yellow6', 'orange7', 'red8','red9' ], 可以自己构建cmap,用colors就不需要使用cmap了 colorbar_kw={'label': '', 'lw':0.5}, 设置colorbar的label以及线的宽度
4、带有投影的基本细节属性
ax.format( title='TD-type disturbance structure ', titleloc='l', rtitle='Level:850(hPa)', xformatter=LongitudeFormatter(), xlim=(100,200), xlabel='lon', coast=True, labels=True, grid=True, gridlinewidth=0.5,gridalpha=0.2, lonlines=20, latlines=10, rc_kw={'tick.pad': 8} ) title='TD-type disturbance structure ', 设置图的标题,标题的位置 titleloc='l', rtitle='Level:850(hPa)', :设置图右边的标题, ltitle='850(hPa)' : 左边的标题同理 xformatter=LongitudeFormatter(), :设置x轴的ticklabel为经度的形式 xlim=(100,200), 设置x轴经度显示的范围 xlabel='lon', 设置x轴的标签,为:lon coast=True, 打开海岸线 labels=True, 打开x轴和y轴的刻度 grid=True, 打开网格线 gridlinewidth=0.5, 设置网格线的宽度 gridalpha=0.2, 设置网格线的透明度 lonlines=20, 设置经度的显示间距 latlines=10, 设置纬度的显示间距 rc_kw={'tick.pad': 8} 设置ticklabel距离tick的间距,但是在投影的图里好像不起作用
5、没有投影的基本细节属性,普通绘图的基本属性
axs.format( title='V(m/s) ', titleloc='l', rtitle='Level:950-200(hPa)', xformatter=LongitudeFormatter(), xlim=(100,210), xlabel='', yticks=pplt.arange(0,40,1), grid=True, xticks=10, ## x 间隔 xtickminor=True, xgridminor=True, ytickminor=False, ygridminor=True, rc_kw={'geogrid.alpha':0.3}, xticks=pplt.arange(0,40,4), fontsize=20, xlocator=1, xminorlocator=0.5, xrotation=20, yticks=[950, 800,600,500,400,300, 200], yscale='symlog', ) 与带投影的起始差不了太多,主要就是关于经纬度坐标的设置有些差别 xticks=10, ## 设置x轴ticklabel的间隔 xtickminor=True, xgridminor=True, 打开x轴的ticklabel的最小值,以及网格线的最小值 ytickminor=False, ygridminor=True, 这个是设置y轴的 rc_kw={'geogrid.alpha':0.3} 设置网格线的透明度 xticks=pplt.arange(0,40,4), 设置x轴tick的具体范围 fontsize=20, 字体的大小 xrotation=20, xticklabel的旋转的角度 yticks=[] 设置yticks的具体显示数值 yscale='symlog', 设置y轴的缩放形式,一般画垂向分布的时候用
6、绘制普通折线图plot
ax.plot(x,y,label='dpdy',legend='ur') label='dpdy', 设置y轴的坐标 legend='ur' 设置图例在右上方,在绘图的时候可以直接设置,
7、一些其他小技巧
ax.axvline(x=18, color='grey', linewidth=1.5,linestyle='-.') 绘制一条垂直线, 颜色为灰色,lw表示线的宽度,ls为线的风格 ax.axhline(y=0, color='grey', linewidth=1.5,linestyle='--') 绘制一条水平线, ox = ax.alty(color='blue8', linewidth=1) lns2=ox.plot(x,dm2,color='blue8', label=r'$-V \cdot \nabla P$') 共用x轴,绘制一条折线 ox2 = ax.twinx( yloc=('axes', 1.05), color='green4', linewidth=1) lns3=ox2.plot(x,dm3*10**11,color='green4', label=r'$-\omega \frac{\partial P}{\partial p}$',) 还是共享x轴绘制一条折线,但是这个y轴不在图上 lns = lns1+lns2+lns3+lns4 labs = [l.get_label() for l in lns] ax.legend(lns, labs,loc='ul',ncols=2, center=False, frame=True) 将共享同一条x轴的折线的y轴的图例画在同一个框内,不然就是四个不同的图例了 ax.bar(x,datay.T*10**11, 0.2, cycle=['c','blue','red6'], label=['MRG','TD','TC'], edgecolor='grey', legend='ul', colorbar_kw={'frameon': False} color=np.where(y>0,'tomato','tab:blue'), #判断大于0的为红色,负的为蓝色 ) 将三个不同的数据的柱形图画在同一个子图上, 三个柱形图的颜色不同,名称也不同,图例的位置为左上角 ax.text(9,0.85,'MRG',bbox=True,bordercolor='w', borderstyle='miter', bboxcolor='w', bboxstyle='square', bboxalpha=0.5, ) 在图上添加text ,设置边缘颜色等 axs[i,j].scatter(lon_center[i,j],875,marker='v', markersize=150, c='red9', alpha=0.8, zorder=2) 绘制散度图的一些命令 ax.format() 可以用来设置全局的坐标属性等,如果存在子图的画,也可以指定某个子图设置属性