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

如何为ggplot2的geom_spoke添加基于箭头长度的风速图例

我来帮你解决这个问题!要在geom_spoke的图例中显示带箭头的风速标记,核心是自定义图例的绘制逻辑——因为默认的图例符号是没有箭头的。下面是完整的解决方案和代码说明:

1. 先处理风向数据转换(关键前提)

气象里的风向指的是风的来向,但geom_spoke的angle参数是箭头指向的方向(也就是风的去向),而且它的角度是逆时针计算的(0=东,π/2=北),和气象的顺时针角度体系不同。所以需要先把风向转为geom_spoke能识别的弧度:

# 假设你的风向列是Wind_Dir(气象角度,0=北,顺时针递增)
wind.dt$angle_rad <- (90 - (wind.dt$Wind_Dir + 180) %% 360) * pi / 180

解释:Wind_Dir + 180是把来向转为去向,%%360确保角度始终在0-360范围内,最后转换为逆时针的弧度角度。

2. 自定义图例箭头绘制函数

我们需要替换默认的图例符号,让它显示带箭头的线段,长度对应风速(radius):

draw_key_spoke_arrow <- function(data, params, size) {
  # 使用grid包创建带箭头的水平线段作为图例符号
  grid::segmentsGrob(
    x0 = 0.5, y0 = 0.5,          # 线段起点(图例格子的中心)
    x1 = 0.5 + data$radius, y1 = 0.5, # 线段终点(长度对应radius)
    arrow = params$arrow,        # 继承geom_spoke的箭头样式
    gp = grid::gpar(
      col = data$colour,
      lwd = data$size * .pt,
      lty = data$linetype
    )
  )
}

3. 完整绘图代码

我补全了你提供的不完整数据,结合自定义逻辑的完整绘图代码如下:

library(ggplot2)

# 补全你的示例数据(添加风速和风向列)
wind.dt <- structure(list(
  Lon = c(170.25, 171, 171.75, 172.5, 173.25, 174, 174.75, 175.5, 176.25, 177, 177.75, 178.5, 179.25, 180, 180.75, 181.5, 182.25, 183, 183.75, 184.5, 185.25, 186, 186.75, 187.5, 188.25, 189, 189.75, 190.5, 191.25, 192),
  Lat = rep(14.25, 30), # 补全纬度列
  Wind_Speed = runif(30, 2, 8), # 模拟风速数据
  Wind_Dir = sample(0:360, 30, replace = TRUE) # 模拟风向数据
), class = "data.frame")

# 转换风向为geom_spoke可用的弧度
wind.dt$angle_rad <- (90 - (wind.dt$Wind_Dir + 180) %% 360) * pi / 180

# 自定义图例key函数
draw_key_spoke_arrow <- function(data, params, size) {
  grid::segmentsGrob(
    x0 = 0.5, y0 = 0.5,
    x1 = 0.5 + data$radius, y1 = 0.5,
    arrow = params$arrow,
    gp = grid::gpar(
      col = data$colour,
      lwd = data$size * .pt,
      lty = data$linetype
    )
  )
}

# 绘制风场图
ggplot(wind.dt, aes(x = Lon, y = Lat)) +
  geom_spoke(
    aes(radius = Wind_Speed, angle = angle_rad),
    arrow = arrow(length = unit(0.1, "inches"), type = "closed"), # 实心箭头样式
    color = "darkblue",
    key_glyph = draw_key_spoke_arrow # 使用自定义图例符号
  ) +
  scale_radius(
    name = "Wind Speed (m/s)", # 图例标题
    range = c(0, 0.3) # 调整箭头在图中的长度范围,避免过长/过短
  ) +
  labs(x = "Longitude", y = "Latitude") +
  theme_bw() +
  theme(
    legend.position = "bottom",
    legend.key.width = unit(1, "inches") # 加宽图例格子,让箭头显示更清晰
  )

关键说明

  • key_glyph = draw_key_spoke_arrow:告诉ggplot使用我们自定义的函数来绘制图例符号,这样图例里的标记就会带箭头。
  • scale_radius:用来控制风速到箭头长度的映射,range参数很重要——因为经纬度坐标和风速的单位差异大,需要调整箭头在图中的显示长度,避免过长或过短。
  • arrow参数:可以自定义箭头的大小、是否实心(type="closed")等样式,按需调整即可。

这样你就能得到一个带有箭头风速图例的风场图啦!

内容的提问来源于stack exchange,提问作者Nazrul.Islam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:33:08