You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于经纬度与风向生成风场箭头图的技术求助

风场箭头图优化方案

问题分析

原代码存在以下核心问题:

  • 风向指向错误:气象风向(dd)代表风的来向,但geom_spoke的angle参数默认对应箭头指向的方向,且两者坐标系标准不同,导致箭头方向颠倒。
  • 箭头长度不合理:用风向值缩放箭头长度不符合逻辑,应基于风速ff控制,且原缩放范围过大导致箭头过长。
  • 未限定目标区域:未设置地图边界,无法聚焦指定的经纬度范围。
  • 代码写法冗余:aes内直接调用wind_data$lon属于不必要的写法,应直接使用列名。

优化后的代码

wind_data <- structure(list(
  lat = c(54.8795643952007, 54.8795643952007, 54.8795643952007, 
          54.8795643952007, 54.8795643952007, 54.8795643952007),
  lon = c(9.18175071980108, 9.19724595932033, 9.21274049124152, 
          9.25921982682543, 9.27471151376548, 9.29020248581541),
  dd = c(202, 202, 202, 202, 203, 203),
  ff = c(8.75, 8.75, 8.75, 8.75, 8.23, 8.23)
), class = "data.frame", row.names = c(NA, -6L))

library(ggplot2)

# 定义指定边界框
nw <- c(2.00348, 55.08617)  # 西北:经度, 纬度
se <- c(15.79388, 46.99609) # 东南:经度, 纬度

ggplot(wind_data, aes(x = lon, y = lat)) +
  # 可选:添加点位标记,直观确认箭头位置
  geom_point(color = "darkblue", size = 1.5) +
  # 绘制风场箭头
  geom_spoke(
    aes(
      # 转换气象风向为geom_spoke兼容角度:箭头指向风的去向
      angle = (270 - dd) %% 360,
      # 用风速ff缩放箭头长度,限定范围避免过长
      radius = scales::rescale(ff, c(0.05, 0.2))
    ),
    arrow = arrow(length = unit(0.03, "inches"), type = "closed"),
    color = "red"
  ) +
  # 严格限定地图边界
  coord_cartesian(
    xlim = c(nw[1], se[1]),
    ylim = c(se[2], nw[2]),
    expand = FALSE
  ) +
  # 保持经纬度比例一致,避免图形扭曲
  coord_equal() +
  # 简化主题提升可读性
  theme_minimal() +
  labs(x = "经度", y = "纬度", title = "风场箭头分布图")

关键优化说明

  1. 风向角度转换:通过(270 - dd) %% 360将气象风向(顺时针从北起算)转换为geom_spoke的角度标准(逆时针从东起算),确保箭头准确指向风的去向。
  2. 箭头长度控制:基于风速ff缩放箭头长度,用scales::rescale将长度限定在0.05-0.2的合理范围,避免箭头过长覆盖点位。
  3. 边界框限定:使用coord_cartesian设置xlim和ylim,严格匹配指定的西北/东南边界,expand=FALSE避免额外留白。
  4. 代码规范优化:移除aes内冗余的wind_data$调用;添加geom_point辅助确认点位;使用theme_minimal简化视觉干扰。

内容的提问来源于stack exchange,提问作者Andreas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:20:46