meteva

提供气象产品检验相关python程序


误差空间分布

<p>[TOC]</p> <pre><code class="language-python">%matplotlib inline %load_ext autoreload %autoreload 2 import meteva.base as meb import meteva.method as mem import meteva.product as mpd import numpy as np import datetime import copy import matplotlib.pyplot as plt import pandas as pd</code></pre> <p>本模块的函数族旨在快速绘制误差的空间分布情况。在浏览本模块函数说明之前可先参阅函数设计的<a href="https://www.showdoc.cc/meteva?page_id=4072178802924517">关键技术思想</a>。本模块包含数值型检验指标的计算方法,为对其进行介绍,以下先对测试数据进行一个简单的介绍。</p> <p><strong><font face="黑体" color=blue size = 5> 测试数据集</font>:</strong> </p> <p> <strong>数据范围</strong> : 为了减少测试数据量又说明问题,仅截取了110 - 120°E, 25 -35°N范围内的观测和预报数据。<br />  <strong>观测数据</strong> : 2020年3月23日至26日2m温度观测数据,时间间隔3小时<br />  <strong>预报数据</strong> :<br />     <strong>ECMWF:</strong> 2020年3月23日08时至23日08时的0至72小时时效2m温度预报数据,起报时间间隔为12小时,预报时效间隔为3小时<br />     <strong>GRAPES_GFS:</strong> 2020年3月23日08时至23日08时的0至72小时时效2m温度预报数据,起报时间间隔为12小时,预报时效间隔为3小时 </p> <pre><code class="language-python">sta_all = pd.read_hdf(r"H:\test_data\input\mpd\program_error_scatter_test.h5","df")</code></pre> <h1>误差站点分布图</h1> <p><strong><font face="黑体" color=blue size = 3>me_scatter(sta_ob_and_fos,s= None,g = None,gll = None, save_dir=None,save_path = None,show = False, print_max = 1,print_min = 1,threshold = 0,add_county_line = False,map_extend = None,title=&quot;误差站点分布图&quot;,sup_fontsize=10, height=None, width=None)</font></strong><br /> 根据输入的站点数据,选择部分数据,误差站点分布图 </p> <h1>绝对误差站点分布图</h1> <p><strong><font face="黑体" color=blue size = 3>mae_scatterr(sta_ob_and_fos,s= None,g = None,gll = None, save_dir=None,save_path = None,show = False, print_max = 1,threshold = 0,add_county_line = False,map_extend = None,title=&quot;绝对误差站点分布图&quot;,sup_fontsize=10, height=None, width=None)</font></strong><br /> 根据输入的站点数据,选择部分数据,误差站点分布图 </p> <h1>均方根误差站点分布图</h1> <p><strong><font face="黑体" color=blue size = 3>rmse_scatterr(sta_ob_and_fos,s= None,g = None,gll = None, save_dir=None,save_path = None,show = False, print_max = 1,threshold = 0,add_county_line = False,map_extend = None,title=&quot;均方根误差站点分布图&quot;,sup_fontsize=10, height=None, width=None)</font></strong><br /> 根据输入的站点数据,选择部分数据,误差站点分布图 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明(上述两个函数参数意义和用法完全相同)</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_ob_and_fos </font></strong></td> <td style="text-align: left;">实况和预报合并对齐后的数据,形式为站点数据格式如上述例子中的sta_all</td> </tr> <tr> <td style="text-align: left;"><strong>s</strong></td> <td style="text-align: left;">用于选择数据样本的字典参数,具体的参数说明可参见meb.sele_by_dict中的<a href="https://www.showdoc.cc/meteva?page_id=3975604785954540"><font face="黑体" color=red size=5>s</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>g</strong></td> <td style="text-align: left;">用于分组检验的参数,具体用法可参见meb.group中的<a href="https://www.showdoc.cc/meteva?page_id=4071849185300418"><font face="黑体" color=red size=5>g</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>gll</strong></td> <td style="text-align: left;">用于分组检验的参数,具体用法可参见meb.group中的<a href="https://www.showdoc.cc/meteva?page_id=4071849185300418"><font face="黑体" color=red size=5>gll</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>save_dir</strong></td> <td style="text-align: left;">图片输出文件夹,文件的路径将据此自动生成</td> </tr> <tr> <td style="text-align: left;"><strong>save_path</strong></td> <td style="text-align: left;">指定图片输出的文件路径,当批量生成多张图片时save_path为包含所有图片的输出路径的列表</td> </tr> <tr> <td style="text-align: left;"><strong>show</strong></td> <td style="text-align: left;">是否在屏幕显示图片,如果save_path 和save_dir 为都None时,程序内部会自动将show设置True</td> </tr> <tr> <td style="text-align: left;"><strong>print_max</strong></td> <td style="text-align: left;">在屏幕上打印误差最大的前print_max的站点的信息</td> </tr> <tr> <td style="text-align: left;"><strong>print_min</strong></td> <td style="text-align: left;">在屏幕上打印误差最小的前print_min的站点的信息,仅在me_scatter函数中包含该参数</td> </tr> <tr> <td style="text-align: left;"><strong>threshold</strong></td> <td style="text-align: left;">在图片显示时,为了突出显示误差较大的站点,将误差小于threshold的站点以更小的尺寸显示</td> </tr> <tr> <td style="text-align: left;"><strong>add_county_line</strong></td> <td style="text-align: left;">绘制底图时是否添加县界</td> </tr> <tr> <td style="text-align: left;"><strong>map_extend</strong></td> <td style="text-align: left;">底图的范围,缺省时自动根据站点数据的范围确定底图范围,不缺省时采用[slon,elon,slat,elat] 列表作为参数,也可也接受<a href="https://www.showdoc.cc/meteva?page_id=3975600815874861">网格信息类变量</a>作为地图范围的参数</td> </tr> <tr> <td style="text-align: left;"><strong>title</strong></td> <td style="text-align: left;">图片标题的确定分为1、全自动,2、半自动,3手动三种方式。<br> 1、全自动:不设置title参数,系统自动采用title的缺省值+自动补齐的其它信息来确定每一幅图的标题;<br> 2、半自动:title 为字符串类型,系统会采用title + 自动补齐的其它信息来确定每一幅图的标题;<br> 3、手动:title为一个包含多个字符串的列表,且列表的长度必须和要绘制的图的数量一致,每一幅图会依次采用列表中的字符串作为标题</td> </tr> <tr> <td style="text-align: left;"><strong>sup_fontsize</strong></td> <td style="text-align: left;">图片标题的字体大小,其它字体将根据标题字体大小自动设置,其中坐标轴字体大小 = sup_fontsize <em> 0.9, 坐标刻度的字体大小 = sup_fontsize </em> 0.8</td> </tr> <tr> <td style="text-align: left;"><strong>width</strong></td> <td style="text-align: left;">图片的宽度,缺省时程序自动设置</td> </tr> <tr> <td style="text-align: left;"><strong>height</strong></td> <td style="text-align: left;">图片的高度,缺省时程序自动设置</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">无返回值</td> </tr> </tbody> </table> <p><strong>调用示例:</strong> </p> <pre><code class="language-python">mpd.me_scatter(sta_all,save_dir = r"H:/",show = True) #对所有的样本进行分析,对于一个站点而言,不同起报时间和预报时效的样本被放在一起检验</code></pre> <pre><code>取值最大的1个站点: id:58437 lon:118.15 lat:30.13 value:6.026918126886564 取值最小的1个站点: id:57359 lon:110.73 lat:31.35 value:-6.288271886336848 图片已保存至H://误差站点分布图(ecmwf).png</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/27c02e0bac70fa7d00fef56c33df7bdc?showdoc=.jpg" alt="" /></p> <pre><code>取值最大的1个站点: id:58437 lon:118.15 lat:30.13 value:5.61214805671111 取值最小的1个站点: id:57355 lon:110.37 lat:31.03 value:-6.654348049681434 图片已保存至H://误差站点分布图(grapes).png</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b2eee861a559d4e11e74fc8aefdda6b5?showdoc=.jpg" alt="" /></p> <p>在上述结果中,站点上误差的大小会以站点的颜色来代表;同时误差的绝对值会以散点的面积来代表,面积越大的代表误差也越大。这样能够突出显示误差较大的站点,便于我们分析问题。如果这种方式还不够突出,可以进一步设置threshold参数来突出显示误差较大的站点。</p> <pre><code class="language-python">#为了突出显示温度误差较大的点,将误差绝对值小于2度的站点的绘图尺寸统一设置为一个很小的常数 mpd.me_scatter(sta_all,s = {"member":["ob","ecmwf"]},threshold = 2) </code></pre> <pre><code>取值最大的1个站点: id:58437 lon:118.15 lat:30.13 value:6.026918126886564 取值最小的1个站点: id:57359 lon:110.73 lat:31.35 value:-6.288271886336848</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/804a7f2e5dc75f50b5365feaee5bd0a9?showdoc=.jpg" alt="" /></p> <p>在上述分析中默认print_max = True, 因此会自动打印哪个站点的误差绝对值最大。这样方便快对有问题的预报进行更详细的研究。比如上面的例子中我们看到湖北西部、湖南中部和安徽南部有几个温度预报偏差比较大的点。但是自动打印的只有一个站点,如果想知道湖南中部那个异常点的站号,可以通过设置print_max来解决。</p> <pre><code class="language-python">mpd.me_scatter(sta_all,s = {"member":["ob","ecmwf"]},print_max = 4) #通过打印更多误差大值信息,可以锁定湖南中部误差最大的点站号为57776</code></pre> <pre><code>取值最大的4个站点: id:58437 lon:118.15 lat:30.13 value:6.026918126886564 id:57776 lon:112.7 lat:27.3 value:5.816474902764022 id:57046 lon:110.08 lat:34.48 value:5.264753170543353 id:58931 lon:118.1 lat:25.72 value:4.396426798380659 取值最小的1个站点: id:57359 lon:110.73 lat:31.35 value:-6.288271886336848</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/ff6f9c3c0e257e4d57f89096d36798ea?showdoc=.jpg" alt="" /></p> <p>如果我们关注的局部的误差较大点在全局的排名很靠后,光靠print_max也不太方便。这是可以运行s参数选择部分数据,缩小分析的范围。例如我们如果想锁定福建中部误差最大值的站号,可以用如下方式实现</p> <pre><code class="language-python">mpd.me_scatter(sta_all,s = {"lon":[117,120],"lat":[25,27],"member":["ob","ecmwf"]},add_county_line = True) #在分析小范围的误差误差时,加上县界更便于定位,此时可以选择add_county_line = True</code></pre> <pre><code>取值最大的1个站点: id:58931 lon:118.1 lat:25.72 value:4.396426798380659 取值最小的1个站点: id:58932 lon:118.93 lat:25.87 value:-3.38709802869922</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/10b423dc42dd358a72f8365b3ad2e9de?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">grid =meb.grid([117,120,1],[25,27,1]) #选取部分区也可以采用grid参数来实现 mpd.me_scatter(sta_all,s = {"grid":grid,"member":["ob","ecmwf"]},g = "ob_hour",gll = [[2,8],[14,20]],save_dir = r"H:/",show = True)</code></pre> <pre><code>取值最大的1个站点: id:58931 lon:118.1 lat:25.72 value:2.76404430636199 取值最小的1个站点: id:58844 lon:119.15 lat:26.15 value:-2.6408102837338467 图片已保存至H://误差站点分布图(ecmwf){grid[117-120.0°E, 25-27.0°N]}(ob_hour=[2, 8]).png</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/bb56270527b0d036c92462c06f78c995?showdoc=.jpg" alt="" /></p> <pre><code>取值最大的1个站点: id:58931 lon:118.1 lat:25.72 value:5.554476563123929 取值最小的1个站点: id:58932 lon:118.93 lat:25.87 value:-4.568368110685221 图片已保存至H://误差站点分布图(ecmwf){grid[117-120.0°E, 25-27.0°N]}(ob_hour=[14, 20]).png</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/aebcc2a6cb540de6e7a5d82e61659f23?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">#上述函数的参数对mae_scatter以及rmse_scatter的使用方法是类似的,示例效果如下 mpd.mae_scatter(sta_all,s = {"member":["ob","ecmwf"]},threshold = 2,map_extend = [108,122,24,36]) </code></pre> <pre><code>取值最大的1个站点: id:57359 lon:110.73 lat:31.35 value:6.288271886336848</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/ae7868a52e2c52676870799405637888?showdoc=.jpg" alt="" /></p> <p>由于一个行政区内的站点的可能距离行政区边缘有一定距离,所以自动绘制的地图范围可能不能完全覆盖用户想要覆盖的行政范围,此时可以用map_extend参数来指定地图的范围,方式如上所示。或者采用在编程过程中已经定义过一个包含了区域范围的网格信息类变量,则也可以将网格信息类变量直接作为参数,示例如下:</p> <pre><code class="language-python">#底图范围采用grid参数来表达,其中网格间隔没有特定要求,但不能和起止经纬度矛盾 grid1 =meb.grid([108,122,1],[24,36,1]) mpd.rmse_scatter(sta_all,s = {"member":["ob","ecmwf"]},threshold = 2,map_extend = grid1) </code></pre> <pre><code>取值最大的1个站点: id:57359 lon:110.73 lat:31.35 value:6.730520749368859</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f4e1eb9345c330ea32c6885ca8bcdcdd?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">grid1 =meb.grid([108,122,1],[24,36,1]) #选取部分区也可以采用grid参数来实现 mpd.rmse_scatter(sta_all,save_path = [r"H:\test_data\output\mpd\program\rmse_ecmwf.png", r"H:\test_data\output\mpd\program\rmse_grapes.png"],threshold = 2,map_extend = grid1 ,show = True,title =["ECMWF","GRAPES"])</code></pre> <pre><code>取值最大的1个站点: id:57359 lon:110.73 lat:31.35 value:6.730520749368859 图片已保存至H:\test_data\output\mpd\program\rmse_ecmwf.png</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/da61ecc17472974390019f83552e27a2?showdoc=.jpg" alt="" /></p> <pre><code>取值最大的1个站点: id:57355 lon:110.37 lat:31.03 value:7.185943748300781 图片已保存至H:\test_data\output\mpd\program\rmse_grapes.png</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b8022835dbedaa18714a5496980b7765?showdoc=.jpg" alt="" /></p> <pre><code class="language-python"></code></pre>

页面列表

ITEM_HTML