├── _使用说明.pdf ├── metedraw.py ├── 数据 ├── 数据处理方法 │ ├── 示例2_文件读写 │ │ ├── 2.xls │ │ ├── 4.csv │ │ ├── xls和csv文件读写.py │ │ └── python文件读写方法 │ ├── 示例1_读取nc文件+画图 │ │ ├── air.nc │ │ ├── 读取nc文件+每层的温度平均值.py │ │ ├── Average_temperature_of_each_level.jpg │ │ ├── Temperature_distribution(1000hPa).jpg │ │ └── 读取nc文件+1000hpa温度分布图.py │ ├── 常见中文显示问题解决方案 │ ├── 示例3_多文件处理 │ │ └── 多文件处理方法 │ └── 数据处理方法 ├── 数据说明 ├── Shenyang_meteorological_month.csv └── Shenyang_meteorological_day_2020.csv ├── 使用示例 ├── Shenyang_meteorological_annual_variation.jpg ├── Shenyang_meteorological_monthly_variation.jpg ├── 【示例1】2015-2020年沈阳市气象数据年变化.py ├── 【示例2】2015年沈阳市气象数据月变化.py ├── 【示例3】nc文件处理 └── Shenyang_meteorological_month.csv ├── README.md └── 历史版本 └── metedraw1.0.py /_使用说明.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orange-Nan/metedraw/HEAD/_使用说明.pdf -------------------------------------------------------------------------------- /metedraw.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orange-Nan/metedraw/HEAD/metedraw.py -------------------------------------------------------------------------------- /数据/数据处理方法/示例2_文件读写/2.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orange-Nan/metedraw/HEAD/数据/数据处理方法/示例2_文件读写/2.xls -------------------------------------------------------------------------------- /数据/数据处理方法/示例1_读取nc文件+画图/air.nc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orange-Nan/metedraw/HEAD/数据/数据处理方法/示例1_读取nc文件+画图/air.nc -------------------------------------------------------------------------------- /数据/数据处理方法/示例1_读取nc文件+画图/读取nc文件+每层的温度平均值.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orange-Nan/metedraw/HEAD/数据/数据处理方法/示例1_读取nc文件+画图/读取nc文件+每层的温度平均值.py -------------------------------------------------------------------------------- /数据/数据处理方法/示例2_文件读写/4.csv: -------------------------------------------------------------------------------- 1 | date,var1,var2 2 | 2022/1/1,1.6,35 3 | 2022/1/2,2.3,37 4 | 2022/1/3,2.1,31 5 | 2022/1/4,1.8,24 6 | 2022/1/5,2,29 7 | -------------------------------------------------------------------------------- /使用示例/Shenyang_meteorological_annual_variation.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orange-Nan/metedraw/HEAD/使用示例/Shenyang_meteorological_annual_variation.jpg -------------------------------------------------------------------------------- /使用示例/Shenyang_meteorological_monthly_variation.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orange-Nan/metedraw/HEAD/使用示例/Shenyang_meteorological_monthly_variation.jpg -------------------------------------------------------------------------------- /数据/数据处理方法/示例1_读取nc文件+画图/Average_temperature_of_each_level.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orange-Nan/metedraw/HEAD/数据/数据处理方法/示例1_读取nc文件+画图/Average_temperature_of_each_level.jpg -------------------------------------------------------------------------------- /数据/数据处理方法/示例1_读取nc文件+画图/Temperature_distribution(1000hPa).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orange-Nan/metedraw/HEAD/数据/数据处理方法/示例1_读取nc文件+画图/Temperature_distribution(1000hPa).jpg -------------------------------------------------------------------------------- /数据/数据处理方法/常见中文显示问题解决方案: -------------------------------------------------------------------------------- 1 | 1.在脚本的第一行添加以下代码: 2 | #coding=utf-8 3 | 4 | 2.读取文件中的中文字符(写入同理): 5 | with open(filename,'r',newline='',encoding='utf-8') as csv_in_file: 6 | 7 | 3.画图显示中文(plt=matplotlib.pyplot): 8 | plt.rcParams['font.sans-serif'] = ['SimHei'] 9 | plt.rcParams['axes.unicode_minus'] = False 10 | -------------------------------------------------------------------------------- /使用示例/【示例1】2015-2020年沈阳市气象数据年变化.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import matplotlib.pyplot as plt 3 | import metedraw as md 4 | 5 | file = r'C:\Users\LULU\Desktop\metedraw\Shenyang_meteorological_month.csv' 6 | lack_values = -999 7 | color_list1 = ['#9ACD32','#6B8E23','#8FBC8F','#006400'] 8 | data = pd.read_csv(file) 9 | data = md.preprocessing(data,print_timeindex = True,lack_values = -999) 10 | md.year_mean(data,scheme = 'bar',range_adjustment = [1,3,4],color_list = color_list1) 11 | 12 | plt.suptitle('2015-2020 annual variation of meteorological data in Shenyang',fontsize=15,y=0.92) 13 | plt.savefig('C:/Users/LULU/Desktop/Shenyang_meteorological_annual_variation.jpg') 14 | plt.show() 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /数据/数据处理方法/示例2_文件读写/xls和csv文件读写.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | 3 | #xls文件读写 4 | file1 = r'C:\Users\LULU\Desktop\2.xls' 5 | data1 = pd.read_excel(file1) #从file1(2.xls)读取data1 6 | print(data1.keys()) 7 | 8 | print(data1) #输出data1 9 | print(len(data1)) #输出data1的行数(5行) 10 | print(data1.keys()) #输出data1的每一列的名称(变量名):Index(['date', 'var1', 'var2'], dtype='object' 11 | print(data1['date']) #输出data1的某一列 12 | 13 | file2 = r'C:\Users\LULU\Desktop\3.xls' 14 | data1.to_excel(file2) #将data1写入file2(3.xls) 15 | 16 | #csv文件读写 17 | file3 = r'C:\Users\LULU\Desktop\4.csv' 18 | data2 = pd.read_csv(file3) #从file3(4.csv)读取data2,后面的操作请读者自行完成 19 | 20 | file4 = r'C:\Users\LULU\Desktop\5.csv' 21 | data1.to_csv(file4) #将data1写入file4(5.csv) 22 | -------------------------------------------------------------------------------- /使用示例/【示例2】2015年沈阳市气象数据月变化.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import matplotlib.pyplot as plt 3 | import metedraw as md 4 | 5 | file = r'C:\Users\LULU\Desktop\metedraw\Shenyang_meteorological_month.xls' 6 | lack_values = -999 7 | color_list1 = ['#9ACD32','#6B8E23','#8FBC8F','#006400'] 8 | data = pd.read_excel(file) 9 | df = md.preprocessing(data,print_timeindex = True,lack_values = -999,start_time='2015-1-1',end_time='2015-12-1') 10 | md.month_mean(df,scheme = 'linesc',range_adjustment = [3],color_list = color_list1) 11 | 12 | plt.suptitle('2015 monthly variation of meteorological data in Shenyang',fontsize=15,y=0.92) 13 | plt.savefig('C:/Users/LULU/Desktop/Shenyang_meteorological_monthly_variation.jpg') 14 | plt.show() 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /数据/数据说明: -------------------------------------------------------------------------------- 1 | metedraw使用的示例数据均来自公开网络,比如美国国家气候数据中心的公开服务器 https://www.ncei.noaa.gov/,您可以在互联网自行下载获取这些公开数据。 2 | 3 | 依据《中华人民共和国气象法》《中华人民共和国网络安全法》《气象数据管理办法(试行)》等,除各级气象主管机构所属的气象台站外,其他任何组织或者个人不得向社会发布公众气象预报和灾害性天气警报; 4 | 任何单位和个人,未经允许,不得将所获取的气象数据以转发、转让、出售等方式对外披露,或用于气象业务、科研开发以外的其他用途。 5 | 6 | 如果有需要使用非公开的相关数据,请您登录中国气象科学数据共享服务网、中国环境监测总站的全国城市空气质量实时发布平台并进行申请使用。 7 | 8 | 如果您已经拥有了下载好的数据文件,希望将它们处理成可以直接配合metedraw使用的形式;或者您对于python导入数据、读写文件等过程不是很了解,请参阅【数据处理方法】文件夹。 9 | 10 | 【数据处理方法】文件夹也提供了一些预处理的示例教程(比如:读取nc文件并画图、python文件读写方法等),您可以自行查看 11 | 12 | —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— 13 | 14 | 示例数据说明: 15 | 1.【Shenyang_meteorological_month.csv】2015-2020年沈阳市逐月气象数据(温度、露点、气压、风速) 16 | *数据来源:美国国家气候数据中心(NCDC),观测间隔为3小时 17 | 预处理:筛选缺测值、时区转换(GMT时间转为北京时间)、月平均 18 | 19 | 2.【Shenyang_meteorological_day_2020.csv】2015-2020年沈阳市每日气象数据(温度、露点、气压、风向、风速) 20 | *数据来源:美国国家气候数据中心(NCDC),观测间隔为3小时 21 | 预处理:筛选缺测值、时区转换(GMT时间转为北京时间) 22 | -------------------------------------------------------------------------------- /数据/数据处理方法/示例3_多文件处理/多文件处理方法: -------------------------------------------------------------------------------- 1 | 1.需要用到的库: 2 | #coding=utf-8 3 | import pandas as pd 4 | from pathlib import Path 5 | from pandas import DataFrame 6 | import numpy as np 7 | import csv 8 | 9 | 2.输入文件夹路径,获取文件列表: 10 | p = Path('D:\BaiduNetdiskDownload') #文件夹路径 11 | filelist = list(p.glob('*\*.csv')) #获取指定路径下的文件名(此处是大文件夹中包含多个小文件夹,此方法可以完成文件夹多重嵌套读取) 12 | 13 | 14 | 3.输出的文件 15 | outfile = r'C:\Users\LULU\Desktop\1.csv' 16 | 17 | 4.查看文件列表 18 | for file in filelist: 19 | print(file) 20 | 21 | 5.利用循环依次遍历所有文件,将需要的信息写入输出文件 22 | 如果需要对数据进行处理,也可以在这一步进行 23 | *建议1:使用csv等文件格式(在一定程度上可以很好地替代xls),提升处理速度 24 | *建议2:学习DataFrame数据结构,熟悉pandas和numpy库中常用的数据处理方法 25 | *建议3:使用map函数+lamba函数提升数据处理运算速度,如:data[i] = data[i].map(lambda x:x/10) 26 | for i in range(len(filelist)): 27 | with open(filelist[i],'r',newline='',encoding='utf-8') as csv_in_file: 28 | with open(outfile,'a', newline='') as csv_out_file: 29 | f = pd.read_csv(csv_in_file,usecols=['date','hour','type','沈阳']) 30 | filewriter = csv.writer(csv_out_file) 31 | data = f[f['type']=='PM2.5'] 32 | data.to_csv(outfile, index=False, header=False,mode = 'a') 33 | -------------------------------------------------------------------------------- /数据/数据处理方法/示例1_读取nc文件+画图/读取nc文件+1000hpa温度分布图.py: -------------------------------------------------------------------------------- 1 | #导入需要用到的包,此处读取nc文件使用的是netCDF4 2 | import netCDF4 as nc 3 | import matplotlib.pyplot as plt 4 | 5 | #导入文件 6 | filename = r'C:\Users\LULU\Desktop\air.nc' 7 | f = nc.Dataset(filename) 8 | 9 | #查看文件信息 10 | #print(f) 11 | 12 | #获取所有变量信息 13 | all_vars = f.variables.keys() #查看变量名称 14 | #print(all_vars) #dict_keys(['level', 'lat', 'lon', 'time', 'air']) 15 | all_vars_info = f.variables.items() #查看变量详细信息 16 | #print(all_vars_info) 17 | 18 | #查看单个变量信息 19 | var_info = f.variables['level'] #获取变量信息 20 | var_data = f['level'][:] #获取变量数据 21 | #print(var_info) 22 | #print(var_data) 23 | 24 | #提取变量 25 | level = f.variables['level'][:] 26 | lat = f.variables['lat'][:] 27 | lon = f.variables['lon'][:] 28 | time = f.variables['time'] 29 | air = f.variables['air'][:] #注意,这里的air是分层次的多维数组(Monthly Mean of Air temperature,时间只有一维,说明是只有某个月的) 30 | air1 = f.variables['air'][0,0,:,:] #取时间为0,层次为0(1000hPa)的所有格点的air(气温) 31 | #print(air1) #可以查看一下数据 32 | 33 | fig=plt.figure(figsize=(10,10),dpi=200) #创建画布 34 | im = plt.imshow(air1,cmap='jet') #绘图,air1必须是二维的数据 35 | plt.yticks([0,36.5,72],['90°N','0°','90°S']) #标上纬度,lat的数目是73 36 | plt.xticks([0,36,72,108,143],['0°','90°E','180°','90°W','0°']) #标上经度,lon的数目是144 37 | plt.colorbar(im,label='Temperature(°C)', orientation='horizontal') #添加图例 38 | plt.title('Monthly Mean of Air temperature(1000hPa)',fontsize=15,y=1.1) #添加标题,调整字号和位置 39 | plt.savefig('C:/Users/LULU/Desktop/Temperature_distribution(1000hPa).jpg') 40 | plt.show() 41 | 42 | 43 | -------------------------------------------------------------------------------- /数据/数据处理方法/数据处理方法: -------------------------------------------------------------------------------- 1 | 一、常见数据类型介绍 2 | 大气科学和环境科学常用的数据文件形式主要可分为以下几类: 3 | 1.文本文件 4 | 包括xls(excel工作表)、xlsx(新版excel工作表)、txt、csv、dat文件等,内容一般为单个站点的数据(时间序列) 5 | 2.nc文件 6 | 一般为多个格点的时间序列,常见参数为data(time,lat,lon) 7 | 比如data(12,20,25)表示有12个时间点,格点数为20*25的数据 8 | 3.二进制文件 9 | 从某些观测仪器直接获取的数据,可能是此类型。 10 | 4.其他文件 11 | 包含地图信息的shp文件等 12 | 13 | 二、在metedraw中使用的数据格式要求 14 | 在metedraw中使用的数据的格式必须为csv文件时间序列,其中第一列为时间,其他列为需要绘图的气象、环境要素的数值。 15 | csv文件的第一行必须为变量名称,用英文逗号“,”隔开。具体请参考示例文件【Shenyang_meteorological_month.csv】。 16 | 您可以使用记事本和excel来直接查看或编辑csv文件,它们非常方便。 17 | 18 | 如果您有一个xls或者xlsx文件,您可以使用excel-另存为csv来获取对应csv文件,不需要额外的操作! 19 | 如果您有一个txt或者其他类型的数据文件,您可以使用excel-获取数据,将您的数据导入到excel中。 20 | 21 | 我们之前也设想过增加直接读取xls文件或者其他文本文件的功能,但是,在Python中直接读取excel文件实在是太慢了,导入文件就需要好几分钟; 22 | 另外还存在xls文件时间显示的问题;大量的xls文件也会占用内存空间。所以我们建议您可以直接在metedraw中使用csv文件。 23 | 24 | 如果有需要,我们可以免费为您提供一些处理xls或其他数据文件的教程。请联系作者邮箱:2680423046@qq.com。 25 | 26 | 三、关于nc文件 27 | 您可以使用netCDF4或者xarray这两个库包在python中处理nc文件,在【数据处理方法】的文件夹中我们也会不断更新一些关于nc文件的使用示例。 28 | 在这个项目的后续版本中,我们也会增加针对nc文件的处理的模块,以及空间分析的模块。 29 | 30 | 四、多文件处理 31 | 多文件处理总是非常的烦人,但是您可以利用Python巧妙地实现这一点,具体请参阅【数据处理方法】文件夹中的使用示例。 32 | 33 | 五、数据初步加工 34 | 大气科学、环境科学等学科中常用的数据初步加工方法包括: 35 | 1.数据清理 36 | 缺测(缺失)值处理、“野点”处理、噪声平滑等 37 | 2.时区转换 38 | 在境外网站或者国际合作项目中下载的数据,往往采用的时区并非北京时间(GMT+8),可能需要将这些数据的时区转换为北京时间(如果您在做中国区域的分析的话)。 39 | 另外请务必了解清楚您所使用的数据的时区。 40 | 3.有效数字及其舍入规则 41 | 准确度:x位有效数字 42 | 精确度:具有y位小数的精确度(精确到y位小数) 43 | 请务必了解您所使用的数据,以及关于它们的准确度和精确度要求。 44 | 4.常用的一些数据预处理方法 45 | (1)中心化(零均值化) 46 | 化为距平值的形式,消除平均值的影响(平均值为0) 47 | (2)标准化 48 | 消除了平均值和量纲的影响(平均值为0,标准差为1) 49 | 极值归一化处理:把原来的数据都化为0~1的数值 50 | (3)等级化(编码法) 51 | (4)滑动平均 52 | 可以起到滤波的作用,消除一部分随机因素的干扰 53 | (5)差分 54 | 可以使整个随机过程达到平稳化 55 | (6)正态化 56 | 使数据成为正态分布的形式 57 | 5.描述数据离散程度的特征量 58 | (1)距平 59 | (2)平均绝对变率(平均差、平均误差) 60 | 距平绝对值的平均值,表示整个观测数据对于平均值的离散程度 61 | (3)平均相对变率 62 | 平均绝对变率与平均值的百分比,一般来说平均相对变率比平均绝对变率可以更好地反映数据的离散程度 63 | (4)极差(较差、全距或振幅) 64 | 某气象要素最大值与最小值之差 65 | (5)均方差(标准差) 66 | (6)离差系数(变差系数、变异系数) 67 | 均方差与样本平均值之比 68 | 7.描述数据分布对称性的特征量 69 | (1)偏度系数 70 | (2)峰度系数 71 | 72 | 六、数据分布情况 73 | 在统计分析的过程中,您必须考虑数据的分布情况。常见的气象数据一般为正态分布(高斯分布)的形式。当然,一些数据并不是标准正态分布,可能是u分布、t分布、 74 | 卡方分布、对数正态分布等形式。尤其是环境类的数据(PM2.5,PM10,黑碳气溶胶等),您必须注意它们可能并不是标准正态分布。 75 | 76 | 我们未来计划也会增加相关的模块,比如绘制频率(频数)分布图等,便于您更直观地观察数据的分布情况。 77 | 78 | 您可以自主学习《气象统计方法》、《统计分析》等课程、书籍,以了解关于数据初步加工和数据分布情况的知识。 79 | -------------------------------------------------------------------------------- /数据/数据处理方法/示例2_文件读写/python文件读写方法: -------------------------------------------------------------------------------- 1 | python文件读写方法 2 | **nc文件的读写请看【示例1】 3 | 4 | 一、普通文本文件读写(txt等) 5 | 1.文本文件读写的几种常见形式: 6 | (1)r 只能读,若文件不存在则报错;r+ 可读可写,若文件不存在则报错,会覆盖原文件。 7 | (2)w 只能写,若文件不存在则创建,会覆盖原文件;w+ 可读可写,若文件不存在则创建,会覆盖原文件。 8 | (3)a 只能写,若文件不存在则创建,不会覆盖原文件(追加写);a+ 可读可写 若文件不存在则创建,不会覆盖原文件(追加写)。 9 | f = open(r'C:\Users\LULU\Desktop\1.txt','r') #打开文件 10 | data = f.read() #使用read读取文件数据 11 | print(data) 12 | 2.关于r+,w+,a+的使用说明: 13 | 使用r+模式,当只读文件的时候,可以读取到其中的内容。当写入内容后,立即读取文件内容,发现什么也读取不到。 14 | 这是由于当你写入内容后,文件句柄会放在写入内容的最后面,因此当你立即读取的时候,句柄会从上次内容最后的位置,朝后面读,因此读取为空。 15 | 当朝文件中写入内容后,调整句柄位置后,再读取文件中的内容,发现就有了内容。 16 | 这是由于我们使用了f.seek(O)方法,将句柄由内容末尾调整到了内容开头,因此就又有了内容。 17 | *注意:新手一开始尽量不要使用r+,w+,a+,容易出错 18 | f = open(r'C:\Users\LULU\Desktop\1.txt','r+') 19 | f.write('2222') 20 | f.seek(0) 21 | data = f.read() 22 | print(data) 23 | f.close() #关闭文件,不影响文件在其他软件中的使用 24 | 3.read,readline,readlines的区别: 25 | (1)read 一次性读取所有内容,不读取文章末尾的换行符,返回的是一整个内容的字符串 26 | (2)readline 一行一行的读取文件中的内容,会读取文中末尾的换行符,返回的每一行也是一个字符串 27 | (3)readlines 一次性读取所有内容,会读取文中末尾的换行符,返回一整个内容的列表 28 | 29 | 二、excel表格文件读写(xls、xlsx) 30 | 读取xls、xlsx文件需要使用pandas库或xlrd库,写入需要用到pandas库或xlwt库(需要提前安装好) 31 | (推荐使用)pandas示例: 32 | import pandas as pd 33 | #读取文件file1(2.xls) 34 | file1 = r'C:\Users\LULU\Desktop\2.xls' 35 | data1 = pd.read_excel(file1) #读取的data1的格式为DataFrame 36 | print(data1) #输出data1 37 | —— —— —— —— —— —— —— —— —— —— 38 | 输出结果: 39 | date var1 var2 40 | 0 2022-01-01 1.6 35 41 | 1 2022-01-02 2.3 37 42 | 2 2022-01-03 2.1 31 43 | 3 2022-01-04 1.8 24 44 | 4 2022-01-05 2.0 29 45 | —— —— —— —— —— —— —— —— —— —— 46 | print(len(data1)) #输出data1的行数(5行) 47 | print(data1.keys()) #输出data1的每一列的名称(变量名):Index(['date', 'var1', 'var2'], dtype='object' 48 | print(data1['date']) #输出data1的某一列 49 | #将data1写入文件file2(3.xls) 50 | file2 = r'C:\Users\LULU\Desktop\3.xls' #如果3.xls不存在,则会被创建(前提是文件路径存在) 51 | data1.to_excel(file2) #将DataFrame写入excel文件 52 | 53 | 三、csv文件(逗号分隔值文本文件)读写 54 | 读写csv文件推荐使用pandas库(也可以使用excel,xls、xlsx文件和csv文件互相转换及预处理) 55 | *注意:读写和处理csv文件的时候需注意表头(列名)是否也一起被读写,也可以使用记事本、excel等手动添加表头 56 | #读取文件file3(4.csv) 57 | file3 = r'C:\Users\LULU\Desktop\4.csv' 58 | data2 = pd.read_csv(file3) #读取的data2的格式为DataFrame,DataFrame的操作同(二),读者可自行完成 59 | #将data1写入文件file4(5.csv) 60 | file4 = r'C:\Users\LULU\Desktop\5.csv' 61 | data1.to_csv(file4) 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # metedraw 2 | metedraw is a project mainly for data visualization projects of Atmospheric Science, Marine Science, Environmental Science or other majors, you can use metedraw for simple data visualization in these areas. 3 | Our intention is to make it easier for students, researchers and practitioners in these fields -- they often have a lot of data to deal with, but most of these items are simple analysis. So we thought we could develop a program that would simplify those repetitive mechanical tasks. 4 | To start with this project, please read _使用说明.docx. The manual in English will be released later. 5 | 6 | metedraw是一个主要面向于大气科学、海洋科学、环境科学等专业的数据可视化项目,您可以使用metedraw来完成一些简单的气象、环境等数据可视化的工作。 7 | 我们的初衷是方便这些专业的学生、科研工作者、从业人员——因为他们通常有大量的数据需要处理,但是大部分只是较为简单的分析。因此我们认为可以开发这样的一个项目,简化那些重复的机械的劳动。 8 | 开始使用这个项目,请阅读【_使用说明.docx】(中文使用手册)。您可以在【使用示例】中获取使用手册中的提及的代码和数据,或者在【数据】中获取更多数据和教程。 9 | 10 | —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— 11 | 12 | # Opinions 关于python自动绘图的一些想法 ——2022/4/16 13 | 和几位大佬交流了一下,目前python气象自动绘图(或者类似功能的项目)存在的一些主要问题和可能的解决方案有: 14 | 15 | 1.文件类型多样 16 | 就气象常用的nc文件而言,不同渠道获取的nc文件光是时间表示方式就有很多种,甚至有一些同学的数据是学长学姐自己处理的,连longname和units都没有(另附使用说明) 17 | 目前看来,自动绘图效果比较好的是时间作为index+要素数值的二维数组(excel(xls)、csv、text等) 18 | 2.参数设置 19 | 过于复杂的参数就失去了“自动绘图”的意义,但是过少的参数同时又无法解决问题 20 | 目前做的比较好的项目,比如seaborn画图、pandas直接计算相关系数的函数等 21 | 3.可视化界面,对于0基础小白来说,或许可视化图形界面会比较友好一点 22 | 类似origin 23 | 24 | 由于本人即将在海洋科学专业读研深造,所以气象这边的项目可能会更新的比较慢(甚至可能长期不更新),如果想继续开发/有好的想法的朋友可以联系我~ 25 | 26 | —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— 27 | 28 | # metedraw 1.1 ——2022/3/26 29 | 【新增】 30 | 预处理函数preprocessing 31 | 32 | 默认功能:解析第一列为时间(方便后续绘图) 33 | 可选功能:print_timeindex输出文件的起始时间和终止时间、lack_values处理异常值、start_time,end_time截取时间段 34 | (其他的常见预处理方法,诸如标准化等,用户可直接使用pandas/sklearn等库包中的相关函数) 35 | 36 | —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— 37 | 38 | # metedraw 1.0 ——2022/2/11 39 | 40 | 【介绍】 41 | 4种常用时间分析方法:时间序列time_series、年变化year_mean、月变化month_mean和日变化hour_mean; 42 | 3个可选参数:scheme画图类型、range_adjustment坐标范围调整、color_list配色方案。 43 | 44 | 【功能特点】 45 | 46 | 1.自动解析时间(气象数据为时间序列,文件第一列为时间),支持多种时间格式; 47 | 2.自动筛选缺测值(文件中的Nan,或者用-999这样的数值标记的缺测值、异常值); 48 | 3.自动根据文件中变量数目,生成相应数目的子图; 49 | 4.自动调整子图排列方式、子图间距; 50 | 5.range_adjustment自动坐标范围调整,解决matplotlibs只能手动调整坐标刻度的问题,适合绘制气压等数据; 51 | 6.可配合matplotlib.pyplot使用,绘制更符合您需求的图片。 52 | 53 | 【作品展示】 54 | 示例1:2015-2020年沈阳市气象数据年变化(温度、露点、气压、风速) 55 | ![Shenyang_meteorological_annual_variation](https://user-images.githubusercontent.com/71633656/153591108-ef5b93dd-02d0-4b08-b1a4-0aa3b9ba4eea.jpg) 56 | -------------------------------------------------------------------------------- /使用示例/【示例3】nc文件处理: -------------------------------------------------------------------------------- 1 | 1.nc文件的数据构造 2 | 一般来说,nc文件有多组数据。 3 | netCDF4查看nc文件数据基本信息代码如下所示 4 | 5 | import netCDF4 as nc 6 | 7 | #导入文件 8 | filename = r'D:\data\rain.nc' 9 | f = nc.Dataset(filename) 10 | 11 | #查看nc文件信息 12 | #print(f) 13 | #获取所有变量信息 14 | all_vars = f.variables.keys() #查看变量名称 15 | print(all_vars) 16 | all_vars_info = f.variables.items() #查看变量详细信息 17 | print(all_vars_info) 18 | 19 | 举例,降水数据里面可能有:prep,time,lat,lon四组数据: 20 | (1)print(all_vars)输出的信息如下: 21 | dict_keys(['prep', 'time', 'lat', 'lon']) 22 | 其中prep(time,lat,lon)为三维的降水数据(时间×纬度×经度),time、lat、lon为一维数据 23 | (2)print(all_vars_info)输出的信息如下(以lon为例): 24 | float32 lon(lon) 25 | units: degrees_east 26 | long_name: longitude 27 | unlimited dimensions: 28 | current shape = (360,) 29 | filling on, default _FillValue of 9.969209968386869e+36 used), ('lat', 30 | 其中units表示单位,long_name表示全称,current shape表示各维度数量。default _FillValue表示缺测/异常值 31 | 32 | 2.nc文件处理(配合metedraw使用) 33 | 先明确自己需要处理的维度,比如说我打算做【时间】分布特征(时间序列、年变化、月变化等),那就必须要对【空间】维度进行平均 34 | 在本示例中,【空间】维度指的是lat和lon,在其他的nc文件中可能还有level等参数 35 | *这里需要使用到numpy 36 | 37 | import numpy as np 38 | import netCDF4 as nc 39 | from pandas import DataFrame 40 | import matplotlib.pyplot as plt 41 | import metedraw as md 42 | 43 | #导入文件 44 | filename = r'D:\data\rain.nc' 45 | f = nc.Dataset(filename) 46 | 47 | #获取数据 48 | prep = f.variables['prep'][:,:,:] 49 | time = f.variables['time'][:] 50 | prep1 = np.mean(prep,axis=(1,2)) 51 | prep1 = list(prep1) 52 | time1 = list(time1) 53 | 54 | #构造DataFrame 55 | dict1 = {'time':time1,'prep':prep1} 56 | data = DataFrame(dict1) 57 | data = md.preprocessing(data) 58 | md.time_series(data) 59 | 60 | plt.suptitle('Time series of precipitation',fontsize=15,y=0.92) 61 | plt.savefig('C:/Users/LULU/Desktop/Rain.jpg') 62 | plt.show() 63 | 64 | 3.注意事项:时间转换 65 | 在一些nc文件中,时间的显示方式与我们熟悉的时间格式可能不太一样,这就涉及到时间转换的问题 66 | 例如:units:days since 1962-01-01 00:00:00 67 | 表示时间是从1962年1月1日开始的天数 68 | 如果我们想知道2020年11月30日-2021年2月3日对应在这个文件里面的时间,可以利用如下代码: 69 | 70 | import datetime as dt 71 | 72 | start_day = dt.datetime.strptime('1962-01-01','%Y-%m-%d') 73 | day1 = dt.datetime.strptime('2020-11-30','%Y-%m-%d') 74 | day2 = dt.datetime.strptime('2021-2-23','%Y-%m-%d') 75 | days = [] 76 | time1 = [] 77 | while day1