气象因素是影响地震前兆异常识别的重要因素,其中降雨对地球物理观测数据影响主要表现为2种情况,一种是连续降雨影响观测数据的趋势性变化,一种是强降雨导致的短时变化。为了及时掌握每次降雨的分布,辅助地球物理学科识别观测资料的异常变化,北京市京津冀地震预测研究中心流体学科组每周会商时,汇总展示过去1周北京地区的降雨情况。目前,数据库中现有降雨量数据主要来自各观测站的气象三要素辅助观测,包括气温、气压、降雨量。北京地区地震部门在运行的气象三要素辅助设备,共8套,数量较少,对降雨量监测效果一般,监测数据很难反映降雨的区域分布情况。因此,每次降雨后收集降雨量数据,及时产出降雨量分布图是展示雨情的关键。人工搜索耗时费力,常用的MapInfo绘制分布图步骤繁冗,且容易出错。
随着计算机技术的不断发展,许多可视化开发工具被应用在各个行业领域,不但以直观的方式增强了数据的呈现效果,而且提高了图表、图形自动产出效率。刘培宁等(2014)用R语言对气象数据分析结果进行了可视化处理;张鑫等(2020)借助Python实现了地面要素实况资料、数值模式产品、雷达反射率的可视化绘制;张慧等(2016)应用MATLAB实现了气象数据自动读取、等值线绘制等功能;谭仁春等(2021)结合GIS领域的中间件工具FME和自然开发语言Python实现了疫情数据可视化;孙睿阳等(2021)将PyEcharts可视化技术引入计量测试领域,对计量测试数据的可视化进行初探。近几年,可视化技术也在地震行业的各个领域得到广泛应用。许瑞杰等(2020)使用DataV可视化工具,将震后应急期震区人口信息、人员伤亡信息和震后救援信息进行直观、动态展示,辅助应急决策;罗勇等(2019)基于开源工具设计地震目录可视化系统,将地震目录的基本特征及统计结果进行展示,为地震科普提供了学习平台;樊晓春(2018)设计了基于GIS和3D台站模型的地震台站可视化运维平台,多方位展示台站设备监控信息,有效提高了地震台网的管理水平。
在众多语言中,Python凭借自身优势被广泛地应用到数据科学领域中,逐渐成为主流编程语言,Python语言功能健全,丰富而成熟的库为数据分析和可视化等领域提供了完整的工具集。借助Python,实现了降雨量数据的快速处理和批量绘图,使重复工作自动化,改善了日常绘图操作复杂、费时费力的现状,为提高工作时效性提供支持。本文主要介绍如何使用Python实现降雨量数据可视化输出,以及在日常工作中的初步应用。
1 降雨量的获取与地震行业相比,气象、水利部门布设了更广泛的降雨量监测站点。这些监测站配备了更专业的设备并每年定期维护,产出数据完整可靠。北京市水务局官方网站(http://swj.beijing.gov.cn/)每日发布北京市降雨统计,详细列出了通州、昌平等11个区域121个监测站近24小时的降雨量观测值,能够客观体现各区的降雨量大小。使用该网站提供的数据导出服务,下载选定日期的降雨量数据进行可视化处理,实现降雨量数据的快速获取。
2 可视化设计与实现 2.1 流程设计数据可视化主要是借助图形化手段,清晰有效地传达有价值的信息,更大地发挥数据的作用,一般包括需求分析、数据准备、图表选择、数据可视化。结合数据分析可视化一般流程,梳理降雨量可视化过程中需解决的几个关键问题:①设计的主要目的是为了实现降雨量分布图的快速自动产出,为业务人员节约时间、提高效率,因此需要程序操作简捷、运行速度快;②程序能批量读取文件夹中已下载的降雨量数据文件,自动产出以天为单位的降雨量分布图,并在文件夹中输出PNG图像格式文件,可查看和复制使用;③降水量分布情况用等降水量线图来表示,产出的降雨量分布图能展示现有的地球物理观测点位置名称、最大降雨量地点和平均降雨量值、降雨日期等要素。
2.2 开发环境搭建在Windows操作系统环境下,使用Python 3.7版本,搭建Anaconda+Visual Studio Code开发环境。选择Anaconda Python发行版,其具有包管理和环境管理功能,预装了数百个常用库,其中包含要使用的库(os、xlrd、glob、numpy、scipy等);Visual Studio Code(VS Code)是一款强大的文本编辑器内置集成终端,具有开发语言智能代码补全、括号匹配、语法高亮等功能,方便用来编写、执行和调试Python代码。前往Anaconda主页和VS Code主页下载安装器,双击安装器,并接受所有默认设置,安装完毕后从Anaconda Prompt中直接用code命令启动VS Code。
2.3 数据读取根据所绘制降雨量分布图的具体需求,数据源主要包括了配置文件、地理信息文件和下载到本地的降雨量文件,其中包括等高线渐变色配置、降雨量监测站和地球物理观测点的名称及坐标、北京行政区边界坐标等数据内容。使用readlines()函数读取.txt格式文件,xlrd模块读取Excel格式文件数据。部分代码如下:
def read_excel(fname):
# 打开文件,获取excel文件的workbook(工作簿)对象
excel=xlrd.open_workbook(fname, encoding_override=”utf-8”)
# 获取sheet对象
all_sheet=excel.sheets()
# 获取绘图数据以及标题数据,max_data_d需要额外处理对应地名+区名
data_d, max_data_d={}, {}
for i, item in enumerate(data_lst):
item =item.replace(“ “, “”).strip()
for k, v in loc_d.items():
if item in v:
if data_lst[i+1]:
max_data_d[k+item]=float(data_lst[i+1])
data_d[item]=float(data_lst[i+1])
break
if”日期”in item:
date_str=data_lst[i+1]
if”平均降水量”in item:
mean_rainfall=data_lst[i+3]
# 获取最大最小值降雨量
max_item = max(max_data_d.items(), key=lambda x: x[1])
min_item = min(max_data_d.items(), key=lambda x: x[1])
2.4 数据处理降雨量文件,包含降雨日期和测量点降雨量测值。由于降雨量测值是分布不均的离散点,为了绘制等值线分布图需要对数据进行插值处理,采用了反距离加权法(IDW)对降雨量数据进行插值处理。假定每个测量点都有局部影响,插值点离测量点越近则权重越大,受该测量点的影响越大,这种方法的优势是保证了测量点本身是绝对准确的,且可以限制插值点的个数。主要步骤如下:
(1)计算所有离散数据点与所求网格点的距离。在二维平面空间,离散点(xi, yi)到网格点(A, B)的距离Di为
$ {{D}_{i}}=\sqrt{{{\left({{x}_{i}}-A \right)}^{2}}+{{\left({{y}_{i}}-B \right)}^{2}}} $ | (1) |
(2)找出离网格点(A, B)距离最近的N个离散点,根据权重计算网格点(A, B)上的估算值Z(A, B)为
$ {{Z}_{\left(A, B \right)}}=\sum\limits_{i=1}^{N}{\left(\frac{{{Z}_{i}}}{{{D}_{i}}} \right)/\sum\limits_{i=1}^{N}{\left(\frac{1}{{{D}_{i}}} \right)}} $ | (2) |
式中,Zi为离散点(xi, yi)上的测值,Z(A, B)为网格点(A, B)上的估算值。
2.5 可视化输出降雨量数据处理后,使用plt.contourf()函数绘制等高线并对等高线之间进行颜色填充,plt.clabel用于添加标注,使用scatter()函数绘制行政区范围。为了方便展示更多信息,在图片上方位置添加降雨日期、最大降雨量、平均降雨量,在图中标记地球物理观测点位置及名称,用FontProperties配置字体格式和大小。使用plt.savefig()函数输出并保存为PNG格式图片,通过配置文件设置显示像素密度。图 1为可视化输出的2020年8月12日8时至2020年8月13日8时降雨量分布图。
把可视化程序输出的网格化降雨量数据与地球物理观测点观测的降雨量数据进行比较,图 2分别给出2020年7—8月、2021年7—8月丰台大灰厂、昌平东三旗、平谷马坊、通州西集、延庆西拨子和延庆张庄共6个观测点的降雨量对比情况。可以看出,网格化数据体现的近2年雨季降雨特点与观测数据比较一致,个别地球物理观测点的网格化数据与观测数据差异较大,如延庆西拨子和延庆张庄,这与其周边存在的水务部门监测站点数量较少有关。从单次降雨的降雨量比较来看,二者的一致性较好,个别网格化的日降雨量与观测日降雨量差异略大,由于网格化所用的日降雨量数据为当日8时至次日8时累计降雨量,而观测点记录的日降雨量为当日24时累计降雨量,二者统计时间的不同使得日降雨量有所差异。可见在水务部门监测站点分布较均匀的区域网格化的降雨量值较为客观,当使用降雨量分布图评估某场降雨的大小时,综合前后24小时降雨量分布更为合理、全面。
通过可视化程序生成的降雨量分布图一定程度上可反映每次降雨的大小和分布特点,补充了各地球物理观测点的降雨情况。
2021年7月1日16:47—17:37顺义板桥井水位观测出现明显阶升变化,变化幅度达2.62 cm,同井水温观测未出现同步变化[图 3(a)]。学科人员发现后分析变化原因,查看该站点气象三要素记录的日降雨量观测值为0.3 mm,可视化程序生成降雨量分布图中该站点附近日降雨量约为20 mm。对比距离较近的昌平东三旗井水位发现也出现类似阶升变化[图 3(b)],变化时段观测降雨量累计达70 mm,判断此井水位阶升变化与降雨干扰有关。由于顺义板桥观测点的观测降雨量与分布图中站点附近的降雨量相差较大难以判断,观测人员前往台站进行现场核实,发现雨量筒漏斗进水口被淤泥堵塞,雨水不能流入导致观测降雨量不准确,其他观测系统正常且数据已恢复正常变化形态,最后判断此次顺义板桥井水位阶升变化与短时强降雨有关。
2021年8月9日通州徐辛庄井水位观测出现连续2次上升变化,幅度分别为2.7 cm、1.0 cm,同井水温无同步变化[图 4(a)],站点未进行降雨量观测。通过可视化程序生成降雨量分布图发现当日降雨主要集中在东部区域(图 5),将其与同区域观测井水位进行分析,发现有相似形态同步变化[图 4(b)],分析认为此次变化为降雨引起的区域性水位变化。
综合以上,可视化程序生成的降雨量分布图可辅助观测资料异常信息识别和性质判定。在日常周月会商中,流体学科还将降雨量分布图汇总展示近期降雨情况,为各学科数据跟踪分析提供了参考。
4 结束语为了实现降雨量分布图自动批量产出,本文主要介绍了基于Python语言的降雨量可视化设计和实现过程。目前程序已应用于地震预测研究中心流体学科业务工作和日常会商中,通过程序自动读取降雨量数据文件、输出包括多种要素的降雨分布图,提高了图件质量和工作效率。
樊晓春. 南京地震台网可视化运维平台的设计与应用[J]. 国际地震动态, 2018(9): 28-32. |
刘培宁, 韩笑, 杨福兴. 基于R语言的NetCDF文件分析和可视化应用[J]. 气象科技, 2014, 42(4): 629-634. |
罗勇, 付红云. 基于开源工具的地震目录可视化系统设计与实现[J]. 山西地震, 2019(1): 11-14. |
孙睿阳, 方信昀. 基于PyEcharts的计量测试数据可视化初探[J]. 中国计量, 2021(3): 111-115. |
谭仁春, 江威, 马艺文, 等. Python和FME下的疫情数据可视化[J]. 地理空间信息, 2021, 19(1): 1-3. |
许瑞杰, 李兆隆, 张原硕, 等. 基于DataV的震后应急信息可视化设计与实现[J]. 华北地震科学, 2020, 38(4): 21-27. |
张慧, 史奎桥, 杨扬, 等. 应用Matlab自动绘制气象等值线图[J]. 广东气象, 2016, 38(4): 74-77. |
张鑫, 曹蕾, 韩基良. 基于Python气象数据处理与可视化分析[J]. 气象灾害防御, 2020, 27(1): 29-33. |