【ProPlot库】初识ProPlot(一)

2022-10-08 16:03:50 浏览数 (1)

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的简要介绍啦!

0 人点赞