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

如何用ggplot2将折线图转换为指定样式的雷达图表?

解决将折线图转换为指定样式雷达图的问题

首先,我完全理解你的需求:把现有的ggplot2折线图(展示三组对比的百分比差异、10个DC类别)转换成雷达图,要求原折线图的横向基准线(y=0)变为完美圆形,且DC1位于正北、其余DC按顺时针排列。下面是分步骤的可行解决方案:


1. 先处理数据格式(雷达图的核心前提)

雷达图对数据格式有特定要求,通常需要宽格式数据(每个DC作为列,每组对比作为行),而且必须先清理缺失值(NaN会直接导致绘制失败)。用dplyr和tidyr快速处理:

library(dplyr)
library(tidyr)

# 过滤掉Count列的NaN值
data_clean <- data %>% filter(!is.na(Count))

# 将长格式数据转换为宽格式:X3作为行名,X2(DC)作为列,Count作为值
data_wide <- data_clean %>%
  pivot_wider(names_from = X2, values_from = Count) %>%
  column_to_rownames("X3")

# 强制DC顺序为DC1到DC10(后续保证顺时针排列)
dc_order <- paste0("DC", 1:10)
data_wide <- data_wide[, dc_order]

2. 方案一:用fmsb快速生成符合要求的雷达图

fmsb是专门绘制雷达图的工具,代码简洁且能完美满足你的基准圆和标签位置需求:

library(fmsb)

# 必须添加两行:雷达图的最大值和最小值(对应原折线图的ylim范围)
radar_data <- rbind(
  rep(25, 10),  # y轴上限
  rep(-50, 10), # y轴下限
  data_wide
)

# 绘制雷达图
par(mar = c(1, 1, 1, 1)) # 缩小边距,让图表更紧凑
radarchart(
  radar_data,
  pcol = c("red", "green", "blue"), # 对应三组对比的颜色(SAPvsSH/SAPvsTD6/TD6vsSH)
  plwd = 2, # 折线宽度
  cglcol = "gray", # 网格线颜色
  cglty = 1, # 网格线类型
  cglwd = 0.8,
  axislabcol = "darkgray", # 轴刻度文字颜色
  seg = 4, # 网格线分段数量
  centerzero = TRUE, # 强制0值基准线为完美圆形(你的核心需求)
  vlabels = dc_order, # DC类别标签
  vlcex = 0.8, # 标签字体大小
  title = "CL"
)

# 添加图例
legend("bottomright",
       legend = rownames(data_wide),
       col = c("red", "green", "blue"),
       lty = 1, lwd = 2,
       bty = "n" # 去掉图例边框
)

这个方法会自动让DC1从正北开始,按顺时针排列所有DC,完全匹配你的样式要求。


3. 方案二:用ggplot2+ggforce实现(保持ggplot生态)

如果你想继续在ggplot2生态里操作,可以结合极坐标和ggforce绘制基准圆:

library(ggplot2)
library(ggforce)

# 给每个DC分配角度:DC1在90°(正北),每个DC间隔36°(360/10),顺时针递减
data_polar <- data_clean %>%
  mutate(
    angle = case_when(
      X2 == "DC1" ~ 90,
      X2 == "DC2" ~ 90 - 36,
      X2 == "DC3" ~ 90 - 72,
      X2 == "DC4" ~ 90 - 108,
      X2 == "DC5" ~ 90 - 144,
      X2 == "DC6" ~ 90 - 180,
      X2 == "DC7" ~ 90 - 216,
      X2 == "DC8" ~ 90 - 252,
      X2 == "DC9" ~ 90 - 288,
      X2 == "DC10" ~ 90 - 324
    ),
    angle_rad = angle * pi / 180 # 转换为弧度(ggplot极坐标要求)
  )

# 绘制雷达图
ggplot(data_polar, aes(x = angle_rad, y = Count, group = X3, color = X3)) +
  # 添加0基准圆
  geom_arc_bar(
    aes(x0 = 0, y0 = 0, r0 = 0, r = 0, start = 0, end = 2*pi),
    color = "black", linetype = 2, size = 1
  ) +
  # 绘制折线和点
  geom_line(size = 1) +
  geom_point(size = 5) +
  # 极坐标转换:偏移pi/2让90°(DC1)处于正北位置
  coord_polar(start = -pi/2) +
  # 保持y轴范围和原折线图一致
  ylim(-50, 25) +
  # 设置DC类别标签
  scale_x_continuous(
    breaks = unique(data_polar$angle_rad),
    labels = unique(data_polar$X2)
  ) +
  # 主题优化
  theme_minimal() +
  theme(
    panel.grid = element_line(color = "gray", linetype = 1),
    axis.text.y = element_text(size = 8),
    plot.title = element_text(hjust = 0.5)
  ) +
  labs(title = "CL", x = "", y = "% difference in n° Pk") +
  # 指定三组对比的颜色
  scale_color_manual(values = c("red", "green", "blue"))

关键注意事项

  • 必须清理NaN值:这很可能是你之前尝试ggradar失败的核心原因,雷达图无法识别缺失值
  • 保证DC顺序正确:无论用哪种方案,都要确保DC1到DC10的顺序,才能实现顺时针排列
  • fmsb方案适合快速出图,ggplot2方案则更灵活,方便和其他ggplot组件结合扩展

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:33