整理记录一下使用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 ',
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,
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,
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'),
)
将三个不同的数据的柱形图画在同一个子图上,
三个柱形图的颜色不同,名称也不同,图例的位置为左上角
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()
可以用来设置全局的坐标属性等,如果存在子图的画,也可以指定某个子图设置属性