“ Proplot是python画图时常用的库,今天就让我们先来一起认识下它吧!”
1
ProPlot简介及安装
ProPlot是python的一个绘图库,主要由美国科罗拉多州立大学大气科学系的博士生Luke Davis创建。它的核心任务是为 Matplotlib的用户提供更流畅的绘图体验, 即“以更少的代码,得到更多的绘图”。
从使用体验来说,ProPlot 引用了 proplot.axes.Axes.format 功能来精简matplotlib冗杂的画图调整步骤。它对Basemap、cartopy、xarray、pandas等气象常用的绘图库进行导入和封装,使组图、子图的绘制变得简单,对于气象人来说十分便捷。
它的安装方式也很简单,在cmd或conda里运行如下代码即可完成安装。
代码语言:javascript复制pip install proplot
或者
conda install -c conda-forge proplot
(ps:其官网:https://proplot.readthedocs.io/en/latest/)
2
ProPlot的优点
ProPlot相比于matplotlib一个很大的优点就是其代码非常简洁,这点我们可以从下面的例子明显体会到。
地球科学的科研工作常需要添加地图背景,python一般使用matplotlib和cartopy画地图,画一个简单地图可以使用如下代码,绘制结果如图。
代码语言:javascript复制import matplotlib as mpl
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
plt.figure(figsize=(6, 3))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines(resolution='110m')
ax.add_feature(cfeature.OCEAN,color='skyblue')
ax.add_feature(cfeature.LAND,color='lightyellow')
gl = ax.gridlines(draw_labels=True,color='lightgrey')
gl.top_labels = False
gl.right_labels = False
ax.set_title('cartopy map')
plt.savefig('fig/cartopy.jpg',dpi=500)
plt.show()
而ProPlot 的代码更为简洁,大家可以与上面进行一个对比。其代码思路是首先调用ProPlot,采用PlateCarree投影(在ProPlot里代号为'cyl')创建一个框架,之后仅用在fig.format()里加入coast(海岸线)、labels(坐标轴显示)、title(标题)便可完成简单的地图绘制。其绘制效果与matplotlib一致,但代码行数却不到matplotlib的一半,可见其简洁性。
代码语言:javascript复制import proplot as pplt
fig,axs = pplt.subplots(figsize=(6, 3),proj='cyl')
fig.format(coast=True,labels=True,title='proplotmap',ocean=True,oceancolor='skyblue',land=True,landcolor='lightyellow')
fig.savefig('proplot1.jpg',dpi=500)
此外,proplot画组图也很便捷。通过使用format函数可以将属性传递到所有的子图中,从而进行统一调节。其他细节设定可见如下网址。
代码语言:javascript复制https://proplot.readthedocs.io/en/latest/_modules/proplot/axes/geo.html
https://proplot.readthedocs.io/en/latest/configuration.html
这里给出一个画组图的简单示例,让大家先感受一下ProPlot的魅力。
代码语言:javascript复制import proplot as pplt
proj1 = pplt.Proj('cyl')
fig,axs = pplt.subplots(nrows=3, ncols=3,refwidth=2,proj=proj1)
axs.format(suptitle='proplot subplots',
lonlim=(80,140),latlim=(0,60),grid=True,labels=True,
abc=True,coast=True,reso='hi',lonlocator=20,latlocator=15
)
fig.savefig('proplotsubplots.jpg',dpi=500)
其中:
- nrows=3:三行, ncols=3 三列
- lonlim=(80,140),latlim=(0,60):分别限制了经度(longitude)和纬度(latitude)的范围
- suptitle='proplotsubplots':定义了标题
- coast=True,reso='hi':画出高分辨率的海岸线,res(resolution)还可以选择'lo', 'med', 'hi', 'x-hi', 'xx-hi'
- lonlocator=20,latlocator=15为longitude、latitude:设置显示的标签的间隔。经度设置的每20度显示一次,如图(100°E,120°E),纬度设置每15度显示一次(15°N,30°N,45°N),同意也有lonminorlocator等
- abc=True:让每幅图左上角显示abcd的标签,适用于论文绘图
3
用ProPlot实现NCL画图效果
其实ProPlot的功能远不止如此。我们还可以继续来调一调外观。如用Python来绘制出NCL的图片风格,下面是一个简单的例子。由于ticks、formatter等参数难以直接在format里设置,于是采用proplot、matplotlib、cartopy混用的方式。以下步骤虽然看着略微复杂,但是在实际画图中,如果要画整个地图,便可以直接复制下面的代码绘制底图,之后的图层可以慢慢叠加。
代码语言:javascript复制import proplot as pplt
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig,axs= pplt.subplots(nrows=2,axheight=6,axwidth=9, proj='cyl', proj_kw={'lon_0':180})
axs.format(grid=False,metalinewidth=2,coast=True,reso='med',coastlinewidth=0.35,suptitle='NCLstyle' ,suptitlesize=30,suptitlepad=10)
for i,direction in enumerate(['in','out']):
ax=axs[i]
extent = [-180,180,-90, 90] # Contiguous USbounds
ax.set_xticks(np.linspace(extent[0],extent[1],7),crs=ccrs.PlateCarree())# set longitude indicators
ax.set_yticks([-60, -30, 0, 30, 60],crs=ccrs.PlateCarree())
lon_formatter =LongitudeFormatter(zero_direction_label=True,number_format='.0f',degree_symbol='')
lat_formatter =LatitudeFormatter(number_format='.0f',degree_symbol='')
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
ax.xaxis.set_minor_locator(plt.MultipleLocator(10))
ax.xaxis.set_major_locator(plt.MultipleLocator(60))
ax.yaxis.set_minor_locator(plt.MultipleLocator(10))
ax.tick_params(which='minor',direction=direction,length=6,width=1,top='on',bottom='on',left='on',right='on')
ax.tick_params(which='major',direction=direction, length=11, width=2,colors='k', top='on',bottom='on',left='on',right='on')
ax.xaxis.set_tick_params(labelsize=23,pad=15)
ax.yaxis.set_tick_params(labelsize=23,pad=15)
fig.savefig('nclstyle.jpg',dpi=500)
同样,我们也可以再加入geocat混用,方便设置坐标值和ticks,绘图风格会更统一。
代码语言:javascript复制import proplot as pplt
import numpy as np
import geocat.viz.util as gvutil
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
fig,axs= pplt.subplots(axheight=3,axwidth=6, proj='cyl', proj_kw={'lon_0': 180})
ax=axs[0]
#ax1.set_global()
ax.format(grid=False,metalinewidth=1,coast=True,reso='hi',coastlinewidth=0.25,suptitle='NCLstyle 2',suptitlesize=15,suptitlepad=10)
gvutil.set_axes_limits_and_ticks(ax,
xlim=[-180,180],
ylim=[-90,90],
xticks=np.arange(-180, 181, 30),
yticks=np.arange(-90, 91, 30),
)
# Usethe geocat.viz function to add minor ticks
gvutil.add_major_minor_ticks(ax,labelsize=10)
# Usegeocat.viz.util convenience function to make plots look like NCL
# plotsby using latitude, longitude tick labels
gvutil.add_lat_lon_ticklabels(ax)
ax.yaxis.set_major_formatter(LatitudeFormatter(degree_symbol=''))
ax.xaxis.set_major_formatter(LongitudeFormatter(degree_symbol=''))
ax.xaxis.set_tick_params(labelsize=10,pad=8)
ax.yaxis.set_tick_params(labelsize=10,pad=8)
ax.grid(False)
fig.savefig('nclstyle2.jpg',dpi=500)
以上就是对于ProPlot的简要介绍啦!