爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 13168|回复: 6

[经验总结] 使用micaps11数据绘制风雨图matplotlib绘制

[复制链接]

新浪微博达人勋

发表于 2020-4-20 16:59:50 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
首先读取micaps11数据使用python读取,读取代码是以下部分:f = open(path, mode='r')
data = f.readlines()
if '11' == data[0].strip().split()[1]:
    U_only = []
    V_only = []
    data_param = []
    for i in range(1, len(data)):
        if len(data_param) < 14:
            lst = data.strip().split()
            data_param += lst
        else:
            lst = data.strip().split()
            if len(U_only) < int(data_param[13]) * int(data_param[12]):
                U_only += lst
            else:
                V_only += lst
    f.close()
    while len(U_only) > int(data_param[13]) * int(data_param[12]):
        U_only.pop()
    while len(V_only) > int(data_param[13]) * int(data_param[12]):
        V_only.pop()
    start_lon = float(data_param[8])
    end_lon = float(data_param[9])
    lon_num = int(data_param[12])

    start_lat = float(data_param[10])
    end_lat = float(data_param[11])
    lat_num = int(data_param[13])

    lat_step = float(data_param[7])

    lon = np.linspace(start_lon, end_lon, lon_num)
    lat = np.linspace(start_lat, end_lat, lat_num)
    print(len(U_only))
    print(len(V_only))
    print(len(data_param))
    U = np.mat(U_only)
    V = np.mat(V_only)
    print(type(U))
    print(U.shape)
    print(V.shape)
    U_data_tmp = U.reshape(-1)
    U_data = U_data_tmp.reshape(lat.shape[0], lon.shape[0])
    V_data_tmp = V.reshape(-1)
    V_data = V_data_tmp.reshape(lat.shape[0], lon.shape[0])
    print("经度个数:", lon.shape)
    print("纬度个数:", lat.shape)
    lon_arr.append(lon)
    lat_arr.append(lat)
    lat_step_arr.append(lat_step)
    U_arr.append(U_data)
    V_arr.append(V_data)
读取后绘制时候u,v需要乘以2.5,具体因为单位的不同,详情看这个http://bbs.06climate.com/forum.php?mod=viewthread&tid=37902
# 绘制风雨图
cut_u_step, cut_v_step = np.array(cut_u_step, dtype='f8') * 2.5, np.array(cut_v_step, dtype='f8') * 2.5
# for k in range(0, len(cut_u_step)):
#     cut_u_step[k], cut_v_step[k] = uv2wsd(cut_u_step[k], cut_v_step[k])

ax.barbs(np.array(cut_lon_step, dtype='f8'), np.array(cut_lat_step, dtype='f8'),
         cut_u_step, cut_v_step,
         sizes=dict(emptybarb=0.25, spacing=0.2, height=0.3), length=5, pivot='middle',
         barb_increments=dict(half=4, full=7, flag=30), barbcolor=colors[j], fill_empty=False)绘制代码,具体参数设置可以去matplotlib官网上查看我就不一一描述了,



20200414-H_24-ECWMF-H00_24-0800-sf850hPa-0-2-2.png

评分

参与人数 1金钱 +10 贡献 +2 收起 理由
mofangbao + 10 + 2

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-4-21 12:46:32 | 显示全部楼层
请问一下 ,在绘制风矢羽的时候,那个空心的圆圈表示风速小,有什么办法可以去掉空心圆圈吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-24 20:12:02 | 显示全部楼层
楼主只显示江苏为绿色的命令,可以请教一下是怎么写的吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-4-29 15:38:32 | 显示全部楼层
bibibol 发表于 2020-4-21 12:46
请问一下 ,在绘制风矢羽的时候,那个空心的圆圈表示风速小,有什么办法可以去掉空心圆圈吗?

有办法的
ax.barbs(np.array(cut_lon_step, dtype='f8'), np.array(cut_lat_step, dtype='f8'),
                 cut_u_step, cut_v_step,
                 # spacing 风速之间的间隔   height风速的高度 emptybarb缺省值的圆圈半径
                 sizes=dict(emptybarb=0.01, spacing=0.2, height=0.3), length=6, pivot='middle',
                 barb_increments=dict(half=5, full=10, flag=50), barbcolor=colors[j], fill_empty=True)
设置emptybarb=0就行了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-4-29 15:40:51 | 显示全部楼层
平流层的萝卜 发表于 2020-4-24 20:12
楼主只显示江苏为绿色的命令,可以请教一下是怎么写的吗?

我就是单独画了一个色斑我可以给你我的代码看看
base_colors = np.array([[0, 255, 0], [150, 230, 0], [185, 255, 154]], dtype='f4')
    base_colors = base_colors / 255
    base_levels = [0, 0.5]
    cmap, norm = matplotlib.colors.from_levels_and_colors(base_levels, base_colors, extend='both')
    base_lon = np.linspace(113., 123., 100)
    base_lat = np.linspace(30., 40., 100)
    ff = np.array(Get_MXN_Array_initx(100, 100, 1))
    # 绘制图片
    im = ax.contourf(base_lon, base_lat, ff[:, :], extend='both', levels=base_levels, cmap=cmap,
                     transform=ccrs.PlateCarree(),
                     norm=norm, zorder=1)

shp2clip(im, ax, city, 320000)

def shp2clip(originfig, ax, shpfile, region):
    sf = shapefile.Reader(shpfile)
    for shape_rec in sf.shapeRecords():
        if shape_rec.record[0] == region:
            vertices = []
            codes = []
            pts = shape_rec.shape.points
            prt = list(shape_rec.shape.parts) + [len(pts)]
            for i in range(len(prt) - 1):
                for j in range(prt, prt[i + 1]):
                    vertices.append((pts[j][0], pts[j][1]))
                codes += [Path.MOVETO]
                codes += [Path.LINETO] * (prt[i + 1] - prt - 2)
                codes += [Path.CLOSEPOLY]
            clip = Path(vertices, codes)
            clip = PathPatch(clip, transform=ax.transData)
    for contour in originfig.collections:
        contour.set_clip_path(clip)
    return clip
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-4-29 15:50:45 | 显示全部楼层
平流层的萝卜 发表于 2020-4-24 20:12
楼主只显示江苏为绿色的命令,可以请教一下是怎么写的吗?

我还是参考您的白化代码做出来的。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-30 10:30:43 | 显示全部楼层
飞翔的气象 发表于 2020-4-29 15:50
我还是参考您的白化代码做出来的。

哦,我还以为是其他的方法,做的不错,我一开始没有想到
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表