Python | 绘制黑底的水平空间分布图

news2025/4/13 13:11:37

写在前面

记录一下之前为了做PPT汇报画的一张图,虽然最后也没怎么用上。为了方面以后再需要,这里把代码和数据整理放到GitHub上。有兴趣的也可以玩玩

需要的数据

风场数据可以从ERA5的官网下载

  • https://cds.climate.copernicus.eu/datasets/reanalysis-era5-single-levels?tab=overview

GPCP降水为日平均数据,下载地址为:

  • https://www.ncei.noaa.gov/data/global-precipitation-climatology-project-gpcp-daily/access/

ETOPO1地形数据的下载地址为:

  • https://www.ngdc.noaa.gov/mgg/global/relief/ETOPO1/data/bedrock/grid_registered/netcdf/

地形数据的介绍为:

  • http://page.oceanmax.cn/Download_data_ETOP.aspx

以上风场变量选择为850hpa,时间为2004年06月22日,降水时间相同

特别说明

此次绘图的脚本(.ipynb),包括之前的绘图的脚本,都是测试跑通过的,都会上传到GitHub上。由于此次使用的数据过大,远远超过25Mb(GitHub上单次上传最大文件容量)。所以测试的数据就没有放上去了,但是从提高的数据下载链接,是可以得到所有使用到的数据。

本质上,代码本身比数据更重要一点,因为我使用的数据基本上都是netcdf格式,你看看我写的逻辑基本上换成自己的数据都可以同理实现。

绘制内容

  • 850hpa水平风场
  • 降水
  • 地形

总体上逻辑很简单,就是三个图的叠加,套娃一样。

再此基础上,把背景版设置为黑色,凸显出地形和降水,这里需要注意的一个是,如果想让降水在地形上显示,必须手动设置降水的范围大于10,否则就得设置地形的透明度。

这里绘制的顺序是先绘制地形,后绘制降水,最后是风场和海岸线

而且,很奇怪的点是:单独画风场叠加降水,以及地形图都很快;但是一起画,速度就贼慢,大约需要90s。这也导致我当时后面再去微调的心思都没有了。

以下最终呈现的结果,其实最初的想法是上面是原始场,下面是滤波场,显示滤波后的扰动在原始场中造成的降水的异常。体现高频波动对于降水的调制作用,但是由于调一次图就得等2min,给我等烦了,也就只有下面的1.0版本了,将就着看吧。

python代码

# ======================== 配置文件参数 ========================
DATA_PATH = 'O:/JAS/H-drive-16350906/ERA5_200406/'
TERRAIN_PATH = 'M:/old_desktop/test_pycode/ETOPO1_Bed_g_gmt4.grd'
SAVE_PATH = './mean.png'

# ======================== 数据预处理函数 ========================
def adjust_longitude(ds):
    
    lon_name = 'longitude'  # whatever name is in the data
    ds['longitude_adjusted'] = xr.where(ds[lon_name] < 0, ds[lon_name]%360,\
                          ds[lon_name])
    ds = (
       ds
       .swap_dims({lon_name: 'longitude_adjusted'})
       .sel(**{'longitude_adjusted': sorted(ds.longitude_adjusted)})
       .drop_vars(lon_name))
    ds = ds.rename({'longitude_adjusted': lon_name})
    return ds

def load_data(file, adjust_lon=False):
    """加载并处理数据"""
    ds = xr.open_dataset(DATA_PATH + file).sortby('latitude')
    return adjust_longitude(ds) if adjust_lon else ds

# ======================== 主数据处理 ========================
# 加载数据集
pre_ds = load_data('GPCP-daily_2004.nc')
u_ds = load_data('uwnd.200406.nc', adjust_lon=True)
v_ds = load_data('vwnd.200406.nc', adjust_lon=True)

# 公共选择参数
common_sel = {
    'latitude': slice(-20, 26),
    'longitude': slice(100, 200),
    'time': slice('2004-06-22', '2004-06-28')
}

# 提取数据
pre = pre_ds.precip.sel(**common_sel)[::2]
lon = pre.longitude.data
lat = pre.latitude.data
x, y = np.meshgrid(lon, lat)
u = u_ds.u.sel(level=850, **common_sel)[::8]
v = v_ds.v.sel(level=850, **common_sel)[::8]
ulon=u.longitude.data
ulat=u.latitude.data
x_u,y_u=np.meshgrid(ulon,ulat)
# ======================== 地形数据处理 ========================
terrain = xr.open_dataset(TERRAIN_PATH).sel(
    x=slice(110, 180), y=slice(-10, 25)).z
tlon = terrain.x.data
tlat = terrain.y.data
# ======================== 绘图配置 ========================
# 颜色映射配置
colors = np.vstack([
    plt.cm.terrain(np.linspace(0, 0.15, 250)),
    plt.cm.terrain(np.linspace(0.23, 0.85, 250))
])
terrain_cmap = LinearSegmentedColormap.from_list('hls', colors)

norm = cm.colors.Normalize(vmin=-8000, vmax=8000)
# 绘图参数
PLOT_PARAMS = {
    'pre_clevs': np.linspace(0, 200, 21),
    'terrain_levels': np.arange(-8000, 8000, 500),
    'quiver_step': 2,
    'title_labels': ['2004.06.24', '2004.06.26']
}

# ======================== 绘图函数 ========================

def create_map(ax, u, v, pre,terrain,title):
    extent = [110, 180,-10, 25]
    ax.set_extent(extent, crs=ccrs.PlateCarree())
    cf = ax.contourf(terrain.x.data,terrain.y.data,terrain,levels=np.arange(-8000,8000,500),
                     transform=ccrs.PlateCarree(),cmap=terrain_cmap,norm=norm,
                      extend='both')
    ax.contourf(pre,  [15,20,30,40,50,60,70,80,90,100],  cmap=cmaps.cmocean_ice_r,
                extent=[110, 200, -20, 26], 
                        transform=ccrs.PlateCarree(),)
    ax.set_title(title,color='white',loc='right',fontsize=15)
    ax.set_title('Precipitation',color='white',loc='left',fontsize=15)
    gl = ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', alpha=0.5, linestyle='--')
    gl.xlabels_top = False
    gl.ylabels_right = False
    gl.xlocator = mticker.FixedLocator([105,120, 135, 150, 165, 180, 185])  # 调整经度刻度位置
    gl.xlabel_style = {'color': 'white','size': 15}  # 设置经度标签颜色为白色
    gl.ylabel_style = {'color': 'white','size': 15}  # 设置纬度标签颜色为白色
    ax.coastlines('10m')
    step = 2
    Q = ax.quiver(x_u[::step, ::step], y_u[::step, ::step], u[::step, ::step], v[::step, ::step],
                  transform=ccrs.PlateCarree())

# ======================== 主绘图程序 ========================
fig, axs = plt.subplots(2, 1, figsize=(10, 12), dpi=300,
                       subplot_kw={'projection': ccrs.PlateCarree(180)})
fig.patch.set_facecolor('black')

for i, ax in enumerate(axs):
    print(i)
    create_map(ax, u.data[i+1], v.data[i+1], pre[i+1], terrain,PLOT_PARAMS['title_labels'][i])

plt.tight_layout()
# fig.savefig(SAVE_PATH, dpi=300, bbox_inches='tight')
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

京东与喜茶关系破裂:切断所有合作 禁止进入办公场所

快科技4月10日消息&#xff0c;据报道&#xff0c;京东集团近日被曝出内部下发全员禁令&#xff0c;全面封杀喜茶产品进入办公区域。 据知情人士透露&#xff0c;京东人力行政部门发布的通知明确规定&#xff1a;全国各职场禁止与喜茶品牌开展任何形式的合作&#xff1b;员工不…

stm32开发(一)之创建工程与第一个程序

ps&#xff1a; 开发模式 1.基于库函数&#xff08;标准库&#xff09; 推荐 2.基于HAL库 图形化 3.基于寄存器 最直接 一、创建工程 1、打开keil5 new Project->路径->命名->保存 2、选择型号&#xff1a;stm32f103c8 初始创建工程我们不使用快捷项目建设 …

【电商】基于LangChain框架将多模态大模型连接数据库实现精准识别

1. LangChain框架 LangChain是一个用于构建基于大语言模型的应用框架&#xff0c;通过模块化设计简化了LLM与外部工具&#xff0c;数据源和复杂逻辑的集成。 连接能力 将多个LLM调用&#xff0c;工具调用或者数据处理步骤串联成工作流 数据感知 外部数据集成 支持连接数据…

鸿蒙HarmonyOS埋点SDK,ClkLog适配鸿蒙埋点分析

ClkLog埋点分析系统&#xff0c;是一种全新的、开源的洞察方案&#xff0c;它能够帮助您捕捉每一个关键数据点&#xff0c;确保您的决策基于最准确的用户行为分析。技术人员可快速搭建私有的分析系统。 ClkLog鸿蒙埋点SDK通过手动埋点的方式实现HarmonyOS 原生应用的前端数据采…

湘西的未来交响曲

故事摘要 在中国湖南湘西的未来&#xff0c;苗族文化与高科技完美融合&#xff0c;构建出一个既传统又现代的世界。晨曦中的沱江&#xff0c;悬浮的吊脚楼面带着品位独特的织锦纹样&#xff0c;展示了令人惊叹的未来建筑美学。独特的工坊技术使得每件首饰都能感知佩戴者的情感&…

STM32_HAL库提高中断执行效率

目录 中断流程分析我的解决办法优缺点 大家都在说STM32 HAL 库中断效率低下。具体哪里不行&#xff1f;如何优化&#xff1f; 我手里的项目要用到多个定时器TIM6、TIM7、TIM9、TIM10、TIM11、TIM12、TIM13&#xff0c;在处理这些定时器中断的时候&#xff0c;也发现了这个问题。…

软件系统安全设计方案,信息化安全建设方案(Word原件)

1.1 总体设计 1.1.1 设计原则 1.2 物理层安全 1.2.1 机房建设安全 1.2.2 电气安全特性 1.2.3 设备安全 1.2.4 介质安全措施 1.3 网络层安全 1.3.1 网络结构安全 1.3.2 划分子网络 1.3.3 异常流量管理 1.3.4 网络安全审计 1.3.5 网络访问控制 1.3.6 完…

什么是微前端?有什么好处?有哪一些方案?

微前端&#xff08;Micro Frontends&#xff09; 微前端是一种架构理念&#xff0c;借鉴了微服务的思想&#xff0c;将一个大型的前端应用拆分为多个独立、自治的子应用&#xff0c;每个子应用可以由不同团队、使用不同技术栈独立开发和部署&#xff0c;最终聚合为一个整体产品…

Web前端之Vue+Element实现表格动态不同列合并多行、localeCompare、forEach、table、push、sort、Map

MENU 效果图公共数据数据未排序时&#xff08;需要合并的行数据未处于相邻位置&#xff09;固定合并行&#xff08;写死&#xff09;动态合并行方法&#xff08;函数&#xff09;执行 效果图 公共数据 Html <el-table :data"tableData" :span-method"chang…

【教学类-102-07】剪纸图案全套代码07——Python点状虚线优化版本+制作1图2图6图

背景需求: 我觉得这个代码里面的输入信息分离太远(42行和241行),想重新优化一下 【教学类-102-05】蛋糕剪纸图案(留白边、沿线剪)04——Python白色(255)图片转为透明png再制作“点状边框和虚线边框”-CSDN博客文章浏览阅读864次,点赞14次,收藏27次。【教学类-102-0…

QT中怎么隐藏或显示最大化、最小化、关闭按钮

文章目录 方法一&#xff1a;通过代码动态设置1、隐藏最大化按钮2、隐藏最小化按钮3、隐藏关闭按钮方法 1&#xff1a;移除 WindowCloseButtonHint方法 2&#xff1a;使用 Qt::CustomizeWindowHint 并手动控制按钮 4、同时隐藏最大化和最小化按钮5、同时隐藏最大化和关闭按钮6、…

KTH5772 系列游戏手柄摇杆专用3D 霍尔位置传感器

产品概述 KTH5772是一款专为游戏手柄上的摇杆应用而设计的3D霍尔磁感应芯片&#xff0c;主要面向对线性度、回报率、灵敏度、功耗要求严格的摇杆应用。KTH5772基于3D霍尔技术&#xff0c;内部分别集成了X轴、Y轴和Z轴三个独立的霍尔元件&#xff0c;能够通过测量和处理磁通密度…

Soybean Admin 使用tv-focusable兼容电视TV端支持遥控器移动焦点

环境 window10 pnpm 8.15.4 node 8.15.4 vite 5.1.4 soybean admin: 1.0.0 native-ui: 2.38.0 vue-tv-focusable: 2.0.1 小米电视 MIUI TV版本&#xff1a;MiTV OS 2.7.1886(稳定版) 飞视浏览器&#xff1a;https://www.fenxm.com/1220.html这里必须使用飞视浏览器&#xff0c…

大模型学习七:‌小米8闲置,直接安装ubuntu,并安装VNC远程连接手机,使劲造

一、说明 对于咱们技术人来说&#xff0c;就没有闲的蛋疼的时候&#xff0c;那不是现在机会来了 二、刷机器准备 1、申请解锁手机 申请解锁小米手机https://www.miui.com/unlock/download.html 下载工具&#xff0c;安装下面的步骤来&#xff0c;官网不欺人吧 打开开发者工…

高可用之战:Redis Sentinal(哨兵模式)

参考&#xff1a;Redis系列24&#xff1a;Redis使用规范 - Hello-Brand - 博客园 1 背景 在我们的《Redis高可用之战&#xff1a;主从架构》篇章中&#xff0c;介绍了Redis的主从架构模式&#xff0c;可以有效的提升Redis服务的可用性&#xff0c;减少甚至避免Redis服务发生完…

CSS Grid布局:从入门到放弃再到真香

Flexbox 与 Grid 布局&#xff1a;基础概念与特点 Flexbox Flexbox&#xff08;Flexible Box Layout&#xff09;&#xff0c;即弹性盒布局模型&#xff0c;主要用于创建一维布局&#xff0c;能够轻松实现元素在一行或一列中的排列、对齐与分布。通过display: flex属性启用 Fl…

Springboot把外部jar包打包进最终的jar包,并实现上传服务器

1、创建lib目录&#xff0c;把jar包放进这个目录下&#xff0c;然后标记lib目录为“资源根路径”&#xff08;鼠标右键lib目录->将目录标记为->资源根路径。之后lib文件夹会有如下的图标变化&#xff09; 文件结构如下&#xff1a; 2、pom文件添加依赖 <dependency…

仿照管理系统布局配置

1.vue仿照snowy 配置&#xff0c;如下图&#xff1a; 2.代码实现 <template><div class"theme-settings"><!-- 导航栏 --><div class"nav-bar"><el-breadcrumb separator"/"><el-breadcrumb-item>导航设置…

GPT - 因果掩码(Causal Mask)

本节代码定义了一个函数 causal_mask&#xff0c;用于生成因果掩码&#xff08;Causal Mask&#xff09;。因果掩码通常用于自注意力机制中&#xff0c;以确保模型在解码时只能看到当前及之前的位置&#xff0c;而不能看到未来的信息。这种掩码在自然语言处理任务&#xff08;如…

适合工程建筑行业的OA系统有什么推荐?

工程行业具有项目周期长、协作链条复杂等特性&#xff0c;传统管理模式下的 “人治”“纸质化” 弊端日益凸显。OA 系统作为数字化管理的核心载体&#xff0c;通过流程标准化、数据可视化&#xff0c;精准解决工程行业项目管理核心痛点。 泛微 e-office 深度聚焦工程场景&#…