爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5827|回复: 5

[求助] 平行四边形区域的垂直剖面该用什么画呢?

[复制链接]
发表于 2025-5-24 12:59:04 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 一大碗年糕 于 2025-9-20 16:20 编辑

想请教一下大家,Python画左图里绿色平行四边形的垂直剖面环流该用什么比较方便呀?😂metpy的cross section好像只能画任意两点之间的剖面2025.9.20更新,添加平行四边形
  1. from matplotlib.patches import Polygon as MplPolygon
  2. import numpy as np
  3. import math
  4. import cartopy.crs as ccrs

  5. def add_parallelogram(ax, center_lon, center_lat, width_deg, height_deg, skew_deg=0.3,
  6.                       angle_deg=0, edgecolor='blue', linewidth=2, linestyle='-',
  7.                       zorder=2, label=None):
  8.     """
  9.     在 cartopy 地理坐标中添加一个平行四边形。
  10.    
  11.     参数:
  12.     - ax: cartopy axes
  13.     - center_lon, center_lat: 中心经纬度
  14.     - width_deg, height_deg: 平行四边形宽高(单位:度)
  15.     - skew_deg: 水平方向的偏移量(控制平行四边形形状)
  16.     - angle_deg: 绕中心顺时针旋转角度(度)
  17.     - edgecolor, linewidth, linestyle: 样式
  18.     """
  19.     angle_rad = math.radians(angle_deg)
  20.     dx, dy = width_deg / 2, height_deg / 2

  21.     # 定义平行四边形的四个角
  22.     corners = [(-dx, -dy), (dx, -dy), (dx + skew_deg, dy), (-dx + skew_deg, dy)]
  23.    
  24.     # 旋转 + 平移
  25.     rotated_corners = []
  26.     for x, y in corners:
  27.         x_rot = x * math.cos(angle_rad) - y * math.sin(angle_rad) + center_lon
  28.         y_rot = x * math.sin(angle_rad) + y * math.cos(angle_rad) + center_lat
  29.         rotated_corners.append((x_rot, y_rot))
  30.    
  31.     # 绘制
  32.     poly = MplPolygon(rotated_corners, closed=True, edgecolor=edgecolor,
  33.                       facecolor='none', linewidth=linewidth, linestyle=linestyle,
  34.                       transform=ccrs.PlateCarree(), zorder=zorder, label=label)
  35.     ax.add_patch(poly)
  36.     return poly
复制代码



截图 2025-05-24 12-53-22.png
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2025-6-23 12:58:59 | 显示全部楼层
用rioxarray可以实现
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2025-7-31 09:45:23 | 显示全部楼层

大佬用的哪个函数实现的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-7-31 09:52:30 | 显示全部楼层
本帖最后由 一大碗年糕 于 2025-7-31 09:54 编辑
tosaka 发表于 2025-7-31 09:45
大佬用的哪个函数实现的

自己定义区域,然后用rixarray的clip截取
  1. import rioxarray as rio
  2. def get_rotated_rectangle_polygon(center_lon, center_lat, width_deg, height_deg, angle_deg):
  3.     angle_rad = math.radians(angle_deg)
  4.     dx, dy = width_deg / 2, height_deg / 2
  5.     offsets = [(-dx, -dy), (dx, -dy), (dx, dy), (-dx, dy)]
  6.     corners = []
  7.     for ox, oy in offsets:
  8.         x_rot = ox * math.cos(angle_rad) - oy * math.sin(angle_rad) + center_lon
  9.         y_rot = ox * math.sin(angle_rad) + oy * math.cos(angle_rad) + center_lat
  10.         corners.append((x_rot, y_rot))
  11.     return Polygon(corners)

  12. AR = AR.rio.write_crs("EPSG:4326")  # 明确是地理坐标

  13. polygon_B = get_rotated_rectangle_polygon(127, 38, 4, 8, 25)  # 朝鲜半岛区域
  14. gdf_B = gpd.GeoDataFrame({"geometry": [polygon_B]}, crs="EPSG:4326")
  15. AR_B = AR.rio.clip(gdf_B.geometry, gdf_B.crs, drop=True)
  16. AR_B = mo.AreaWeightMean(AR_B)
  17. AR_B = mo.Standardization(AR_B)
  18. AR_B.plot(label=region[re])
复制代码


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2025-8-4 15:51:25 | 显示全部楼层
{:5_213:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

 楼主| 发表于 2025-9-20 16:21:05 | 显示全部楼层
更新一下
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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