当前位置: 首页 > news >正文

【Python气象可视化】用Cartopy+Matplotlib绘制青藏高原涡移动轨迹图(附完整代码+颜色渐变时间轴)

使用Python绘制青藏高原涡(高原涡)的移动轨迹图。使用Python绘制青藏高原涡移动轨迹图。通过Cartopy库创建中国地图并添加地理特征(海岸线、边界等),利用Matplotlib绘制高原涡移动路径,用颜色渐变表示时间顺序。代码包含地图投影设置(PlateCarree中心经度105°)、青藏高原区域标注、轨迹可视化(线图+散点图)以及图例元素(指北针、比例尺、颜色条)的添加。该方案可直观展示高原涡在中国区域的移动轨迹,为气象研究提供可视化支持。


1. 导入库

import numpy as np import cartopy.crs as ccrs import cartopy.feature as cfeature 
import matplotlib.pyplot as plt import matplotlib.font_manager as fm 
import cartopy.mpl.ticker as cticker
  • numpy:用于数值计算,处理轨迹数据。
  • cartopy:用于地理空间数据的可视化,支持地图投影和地理特征绘制。
  • matplotlib:用于绘制图表。
  • cartopy.mpl.ticker:提供地图坐标轴的格式化工具。

2. 设置中文字体

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'KaiTi', 'SimSun'] plt.rcParams['axes.unicode_minus'] = False
  • 确保图表中显示中文和负号(如“-”符号),避免乱码。

3. 创建中国地图基础函数

def create_china_map(ax, extent=[70, 140, 20, 45], spec=10):"""创建中国区域基础地图"""ax.set_extent(extent, crs=ccrs.PlateCarree())  # 设置地图范围(经度70-140,纬度20-45)ax.add_feature(cfeature.COASTLINE.with_scale('50m'))  # 添加海岸线ax.add_feature(cfeature.BORDERS, linestyle=':')  # 添加国界线ax.add_feature(cfeature.LAKES, alpha=0.5)  # 添加湖泊ax.add_feature(cfeature.OCEAN, alpha=0.2)  # 添加海洋ax.add_feature(cfeature.LAND, alpha=0.1)  # 添加陆地provinces = cfeature.NaturalEarthFeature(...)  # 添加中国省级边界ax.add_feature(provinces)# 设置坐标轴刻度、网格线等
  • set_extent:定义地图显示区域(中国大部分地区)。
  • add_feature:添加地理特征(如海岸线、湖泊、海洋等)。
  • NaturalEarthFeature:使用自然地球数据集绘制中国省级边界。

4. 绘制高原涡轨迹图的函数

def plot_vortex_track(lons, lats):"""绘制高原涡轨迹图并直接显示"""plt.figure(figsize=(14, 10))  # 设置画布大小ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=105))  # 使用PlateCarree投影,中心经度105°create_china_map(ax)  # 调用函数绘制中国地图ax.add_patch(plt.Rectangle((73, 28), 32, 12, ...))  # 用矩形标注青藏高原区域ax.plot(lons, lats, 'b-', linewidth=2.5, ...)  # 绘制轨迹线scatter = ax.scatter(lons, lats, c=np.arange(len(lons)), cmap='viridis', ...)  # 绘制轨迹点plt.colorbar(scatter, ...)  # 添加颜色条plt.title('青藏高原涡移动轨迹', fontsize=16)  # 设置标题ax.text(...)  # 添加指北针、比例尺、标签plt.show()  # 显示图表
  • PlateCarree(central_longitude=105):使用Plate Carree投影(等经纬度投影),中心经度105°(中国中部)。
  • Rectangle:用矩形框标注青藏高原区域(经度73-105,纬度28-40)。
  • plotscatter:分别绘制轨迹线和轨迹点,cmap='viridis'表示颜色渐变。
  • colorbar:颜色条显示轨迹点的顺序。
  • 指北针、比例尺、标签:通过ax.text()添加文本说明。

5. 主程序(示例数据)

if __name__ == '__main__':lons = np.array([...])  # 示例经度数据(高原涡移动路径)lats = np.array([...])  # 示例纬度数据plot_vortex_track(lons, lats)  # 调用函数绘制轨迹图
  • lonslats:表示高原涡移动路径的经度和纬度坐标。
  • plot_vortex_track:调用函数生成图表并直接显示。

6. 代码功能总结

  • 地图绘制:使用Cartopy创建中国地图,并添加地理特征(海岸线、边界等)。
  • 轨迹可视化:用线和点表示高原涡移动路径,颜色渐变表示时间顺序。
  • 图例与标注:添加指北针、比例尺、颜色条和青藏高原区域标注。
# 高原涡轨迹图绘制 - 直接显示模式
import numpy as np
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import cartopy.mpl.ticker as cticker# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'KaiTi', 'SimSun']  # 稳定的中文字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号def create_china_map(ax, extent=[70, 140, 20, 45], spec=10):"""创建中国区域基础地图"""# 设置地图范围ax.set_extent(extent, crs=ccrs.PlateCarree())# 添加基础地理特征ax.add_feature(cfeature.COASTLINE.with_scale('50m'))ax.add_feature(cfeature.BORDERS, linestyle=':')ax.add_feature(cfeature.LAKES, alpha=0.5)ax.add_feature(cfeature.OCEAN, alpha=0.2)ax.add_feature(cfeature.LAND, alpha=0.1)# 添加中国省级边界provinces = cfeature.NaturalEarthFeature(category='cultural',name='admin_1_states_provinces',scale='50m',facecolor='none',edgecolor='gray',linewidth=0.5)ax.add_feature(provinces)# 设置坐标轴ax.set_xticks(np.arange(extent[0], extent[1] + spec, spec), crs=ccrs.PlateCarree())ax.set_yticks(np.arange(extent[2], extent[3] + spec, spec), crs=ccrs.PlateCarree())lon_formatter = cticker.LongitudeFormatter()lat_formatter = cticker.LatitudeFormatter()ax.xaxis.set_major_formatter(lon_formatter)ax.yaxis.set_major_formatter(lat_formatter)ax.gridlines(linewidth=0.5, color='gray', alpha=0.5, linestyle='--')def plot_vortex_track(lons, lats):"""绘制高原涡轨迹图并直接显示"""# 创建画布plt.figure(figsize=(14, 10))ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=105))# 创建地图create_china_map(ax)# 标记青藏高原区域ax.add_patch(plt.Rectangle((73, 28), 32, 12,linewidth=1.5, edgecolor='darkred',facecolor='lightyellow', alpha=0.4,transform=ccrs.PlateCarree()))# 绘制轨迹线ax.plot(lons, lats, 'b-', linewidth=2.5, transform=ccrs.PlateCarree())# 标记点scatter = ax.scatter(lons, lats, c=np.arange(len(lons)),cmap='viridis', s=50, edgecolor='black',transform=ccrs.PlateCarree())# 添加颜色条cbar = plt.colorbar(scatter, ax=ax, orientation='horizontal',pad=0.05, label='轨迹点顺序')# 设置中文标题plt.title('高原涡或台风移动轨迹', fontsize=16, pad=20)# 添加指北针ax.text(0.95, 0.95, 'N', transform=ax.transAxes,fontsize=16, va='top', ha='right',bbox=dict(boxstyle='circle', facecolor='white', alpha=0.8))# 添加比例尺ax.text(0.2, 0.05, '1000公里', transform=ax.transAxes,bbox=dict(facecolor='white', alpha=0.8))# 添加青藏高原标签ax.text(88, 34, '青藏高原区域', fontsize=12,transform=ccrs.PlateCarree(),bbox=dict(facecolor='white', alpha=0.6))# 直接显示图像plt.show()if __name__ == '__main__':# 高原涡轨迹数据lons = np.array([89.05, 96.47, 99.89, 100.08, 102.05, 105.01, 107.49, 108.66,110.91, 111.46, 113.93, 114.00, 120.00, 121.97, 122.02, 122.97,123.49, 124.05, 122.99])lats = np.array([36.02, 34.99, 34.98, 34.56, 35.00, 34.99, 35.02, 36.66,35.56, 36.42, 36.00, 35.90, 36.00, 37.00, 38.00, 39.00,40.00, 42.00, 42.99])# 绘制并显示轨迹图plot_vortex_track(lons, lats)

http://www.dtcms.com/a/308772.html

相关文章:

  • 数据库学习--------数据库日志类型及其与事务特性的关系
  • 题目:BUUCTF之rip(pwn)
  • [算法]Leetcode3487
  • 【高等数学】第七章 微分方程——第五节 可降阶的高阶微分方程
  • 第三章·数据链路层
  • 前端路由深度解析:Hash 模式 vs. History 模式
  • 数字化应急预案:构筑现代安全防线
  • 实时语音流分段识别技术解析:基于WebRTC VAD的智能分割策略
  • MySQL 中的事务隔离级别有哪些?分别解决什么问题?
  • 图结构知识构造方法详解 ——面向垂直领域的高效知识库构建方案
  • CentOS 7 编译 Redis 6.x 完整教程(解决 GCC 版本不支持 C11)
  • lesson29:Python元类与抽象类深度解析:从接口定义到元编程实践
  • mysql 日志机制
  • Java 接口(上)
  • 哈希相关的模拟实现
  • 04百融云策略引擎项目laravel实战步完整安装composer及tcpdf依赖库和验证-优雅草卓伊凡
  • 常用的ROS(Robot Operating System,机器人操作系统)包,用于机器人软件开发的工具和库
  • isasssim robotiq夹爪踩坑
  • 同个主机拉取不同权限仓库的方法
  • 疯狂星期四文案网第25天运营日记
  • Product Hunt 每日热榜 | 2025-07-31
  • 零信任网络概念及在网络安全中的应用
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 80(题目+回答)
  • 高等教育领域:依托VR教育服务,推动科研与教学的创新性发展
  • 智慧安防徘徊识别误报率↓77%:陌讯时序 - 空间融合算法实战解析
  • thinkphp3.2 中使用redis
  • LeetCode 面试经典 150_数组/字符串_买卖股票的最佳时机(7_121_C++_简单)(贪心)
  • 常见的中间件漏洞练习教程
  • Druid数据库连接池
  • 网安学习NO.20