Python版anatool编写记录(一)

第N+N次计划

计划编写一个python版本的anatool,用作模式结果分析,能做到以下几点:

功能要求

1.查看数据内容(包括GrADS格式,grib2格式和二进制bin格式);
2.根据选择获取相应的要素;
3.对提取出来的要素数据进行处理加工(包括不仅限于,集合平均,离散度,谱分解等等);
4.绘制相应的图形
5.待增加

性能要求

1.面向对象,需要设置、选择或输入的尽量少;
2.运行速度快;
3.图形美观;
4.有可能的话做成UI交互。

GrADS格式数据信息显示和读取

使用了miniufo大大发布在github上的工具xgrads,传送门
https://github.com/miniufo/xgrads
注意:
1.xgrads的Examples里面调用方法\color{#D2691E}{open\_mfDataset}\在实际中应该是\color{#D2691E}{open\_mfdataset}\
2.xgrads使用了Dask包,可以有效地减少数据读取时间,Dask官方描述自己为:

Dask is a flexible library for parallel computing in Python.
Dask是一个十分灵活的用于Python的并行计算库。

所以在读取数据时需要按照dask.array的要求来读取(还没弄的很清楚)
3.设计的ReadBin包结构如下(注意__init__.py必须有,可以是空文件):
ReadBin/
├── getvar.py
├── __init__.py
├── __pycache__
└── showctl.py

其中showctl.py为读取CTL描述文件,并显示:

# -*- coding: utf-8 -*-
from xgrads import CtlDescriptor

class showctl:
    '输出CTL文件内容信息'
    def __init__(self,ctlname):
        self.ctl = ctlname

    def ctlinfo(self):
        ctlinfo = CtlDescriptor(file=self.ctl)
        print(ctlinfo)

其中getvar.py为读取GrADS数据,从中提取某要素的单层数据:

# -*- coding: utf-8 -*-
from xgrads import open_CtlDataset

class Grads_data:
    'Extract data from GrADS file with CTL file.'
    def __init__(self,ctlname):
        self.ctl = ctlname

    def getall(self):
        dset = open_CtlDataset(self.ctl)
        return dset

    def getsinglelevel(self,varname,ntime,nlev):
        dset = open_CtlDataset(self.ctl)
        return dset[varname][ntime,nlev,:,:]

编写了一个测试脚本,读取最底层温度,并绘图

# -*- coding: utf-8 -*-
import numpy as np
import xarray as xr
import cartopy.crs as ccrs
import cartopy.feature as cfeat
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import matplotlib.pyplot as plt
import ReadBin.getvar as gv

ctlname = "./database/post.ctl_202006020004400"
ds = gv.Grads_data(ctlname)
ntim = 0
nlev = 25 #这里按照常理应该是0,但是查询读取之后的数据发现垂直层似乎交换了,存疑?
varn = "t"
labeln = "temperature"
t = ds.getsinglelevel(varn,ntim,nlev).compute() - 273.15
lons=t.lon.data
lats=t.lat.data

temp = xr.DataArray(t.data, coords=[lats,lons], dims=['latitude','longitude'])

# 创建画图空间
proj = ccrs.PlateCarree() #创建投影
fig = plt.figure(figsize=(16,9)) #创建页面
ax = fig.subplots(1, 1, subplot_kw={'projection': proj}) #子图
# 设置地图属性:加载国界、海岸线、河流、湖泊
ax.add_feature(cfeat.BORDERS.with_scale('50m'), linewidth=0.8, zorder=1)
ax.add_feature(cfeat.COASTLINE.with_scale('50m'), linewidth=0.6, zorder=1)
ax.add_feature(cfeat.RIVERS.with_scale('50m'), zorder=1)
ax.add_feature(cfeat.LAKES.with_scale('50m'), zorder=1)
# 设置网格点属性
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
linewidth=1.2, color='k', alpha=0.5, linestyle='--')
gl.xlabels_top = False #关闭顶端标签
gl.ylabels_right = False #关闭右侧标签
gl.xformatter = LONGITUDE_FORMATTER #x轴设为经度格式
gl.yformatter = LATITUDE_FORMATTER #y轴设为纬度格式
# 设置colorbar
cbar_kwargs = {
'orientation': 'horizontal',
'label': labeln,
'shrink': 0.8,
}
# 画图
levels1 = np.arange(0,45,1)
levels2 = np.arange(0,45,5)
a = temp.plot.contourf(ax=ax, levels=levels1, cmap='Spectral_r',cbar_kwargs=cbar_kwargs, transform=ccrs.PlateCarree())
b = temp.plot.contour(ax=ax,levels=levels2,colors=['black'],transform=ccrs.PlateCarree())
plt.clabel(b, inline=True, fontsize=10,fmt='%d')
plt.savefig(labeln+'.jpg')

display  test.jpg

显示图形如下:


temperature.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    伊森H阅读 3,039评论 0 15
  • Python基础知识_0001 1.0 Python是一种怎样的语言 Python是一门跨平台、开源、免费的解释型...
    爱学习的小白F1阅读 1,065评论 0 1
  • 互连及输入输出组织 一、输入设备和输出设备 输入输出系统:通常把外部设备及其接口线路、I/O控制部件以及I/O软件...
    我可能是个假开发阅读 1,313评论 0 3
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 5,696评论 0 5
  • 昨天,在回家的路上,坐在车里悠哉悠哉地看着三毛的《撒哈拉沙漠的故事》,我被里面的内容深深吸引住了,尽管上学时...
    夜阑晓语阅读 3,774评论 2 9