爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 306|回复: 2

[求助] 画站点降水落区色斑图时出现问题,求高手帮忙看看!

[复制链接]

新浪微博达人勋

发表于 2024-3-18 10:56:15 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 nightelfxu 于 2024-3-18 11:00 编辑


import numpy as np
import pandas as pd
from scipy.interpolate import Rbf
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib as mpl
from mpl_toolkits.basemap import Basemap
import matplotlib.patches as mpatches
import shapefile
from matplotlib.path import Path
from matplotlib.patches import PathPatch
#m:坐标的投影对象;originfig:等值线对象;ax:绘制的句柄;shpfileshp边界文件
def shp2clip(m,originfig,ax,shpfile):
    sf = shapefile.Reader(shpfile)
    clip=None
    vertices = []
    codes = []
    for shape_rec in sf.shapeRecords():
            pts = shape_rec.shape.points
            prt = list(shape_rec.shape.parts) + [len(pts)]
            # print(prt)
            for i in range(len(prt) - 1):
                for j in range(prt, prt[i+1]):
                    vertices.append(m(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

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 数据准备
df = pd.read_excel('I:\\13-22pro\\prc.xlsx', engine='openpyxl') #读取Excel
name = df['Station_Name']
lon = df['Lon']
lat = df['Lat']
rain = df['PRE_Time_2020']
# 绘图准备
olon = np.linspace (115.0,126.0,500) #经纬坐标,有50个格点
olat = np.linspace (40.0,50.0,500) #纬度坐标,,有50个格点
olon,olat = np.meshgrid(olon,olat) #生成坐标网格 meshgrid网格化
func = Rbf(lon,lat,rain,function='linear') #插值函数 调用Rbf插值函数中的插值法linear
rain_data_new = func(olon,olat) #插值
rain_data_new[rain_data_new <0 ] = 0
#新建figure
fig = plt.figure(figsize=(19.6, 17.4))
#新建区域ax1
#figure的百分比,figure 10%的位置开始绘制, 宽高是figure80%
left, bottom, width, height = 0.01, 0.00, 0.98, 0.98
#获得绘制的句柄
ax1 = fig.add_axes([left, bottom, width, height])
m= Basemap(llcrnrlon=118.2, llcrnrlat=44.7, urcrnrlon=124.5, urcrnrlat=47.5, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
m.readshapefile("D:/Python_study/map/xam/x",'xam', drawbounds=True)
#色彩定制:24小时降水量级色标
clevs = [0.0,0.1,10.,25.,50.,100.,250.,500] #自定义颜色列表
cdict = ['#FFFFFF','#A9F090','#40B73F','#63B7FF','#0000FE','#FF00FC','#850042'] #自定义颜色列表 '#A9F090','#40B73F','#63B7FF','#0000FE','#FF00FC','#850042'
my_cmap = colors.ListedColormap(cdict) # 自定义颜色映射 color-map
norm = mpl.colors.BoundaryNorm(clevs,my_cmap.N) # 基于离散区间生成颜色映射索引
x, y = m(olon, olat) # compute map proj coordinates.
#  绘制等值线、等值线填色
cs = m.contourf(x,y,rain_data_new,clevs,cmap=my_cmap,norm=norm,extend='both')
#裁切
clip = shp2clip(m,cs,ax1,"D:/Python_study/map/xam/x")
xx,yy =m(121.8, 47.5)
plt.text(xx,yy,'兴安盟降水实况图\n9320-9420\n兴安盟气象台',fontsize=30,ha='center')
# 自定义图例标记
patch0 = mpatches.Patch(color=cdict[0], label='无降水')
patch1 = mpatches.Patch(color=cdict[1], label='0~10')
patch2 = mpatches.Patch(color=cdict[2], label='10~25')
patch3 = mpatches.Patch(color=cdict[3], label='25~50')
patch4 = mpatches.Patch(color=cdict[4], label='50~100')
patch5 = mpatches.Patch(color=cdict[5], label='100~250')
patch6 = mpatches.Patch(color=cdict[6], label='≥250')
# 构造图例
handles = [patch0, patch1, patch2, patch3, patch4, patch5, patch6]
ax1.legend(loc='lower left',handles=handles, title='图例(毫米)', title_fontsize=30, fontsize=25,
           shadow=False, frameon=True, edgecolor='#000000'  )
plt.show()画出的图中间有空白,哪位大神知道是什么原因么?
微信截图_20240318110007.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2024-3-18 13:14:59 | 显示全部楼层
你白化处理的时候有问题,具体是shp2clip这里。你不白化就可以发现一切正常,建议检查一下你的地图文件
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-3-18 14:26:16 | 显示全部楼层
笺疏 发表于 2024-3-18 13:14
你白化处理的时候有问题,具体是shp2clip这里。你不白化就可以发现一切正常,建议检查一下你的地图文件

感谢感谢,确实是,换了个shp文件就可以了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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