前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【ProPlot库】初识ProPlot(一)

【ProPlot库】初识ProPlot(一)

作者头像
自学气象人
发布2022-10-08 16:03:50
2.3K0
发布2022-10-08 16:03:50
举报
文章被收录于专栏:自学气象人

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档