# R語言可視化中如何用ggplot構造期待已久的雷達圖
雷達圖(Radar Chart)又稱蜘蛛圖(Spider Plot),是一種將多維數據映射到極坐標系的經典可視化方法。在R語言生態中,雖然ggplot2并未原生支持雷達圖,但通過巧妙的坐標轉換和擴展包配合,我們依然能夠實現專業級的雷達圖效果。本文將詳細介紹三種主流實現方案,并提供完整的代碼示例。
## 一、雷達圖的核心原理與適用場景
### 1.1 基本特征
- **極坐標映射**:將直角坐標系轉換為極坐標系
- **軸線輻射**:每個變量對應一條從中心向外輻射的軸線
- **數值映射**:數據值轉換為軸線上的點,相鄰點連線形成多邊形
### 1.2 典型應用場景
- 多維數據對比(如球員能力雷達圖)
- 性能評估體系展示
- 多指標綜合評價分析
## 二、基于ggplot2的基礎實現方案
### 2.1 數據準備
首先構造示例數據集:
```r
library(tidyverse)
skills <- tibble(
category = c("編程", "統計", "可視化", "機器學習", "溝通"),
張三 = c(8, 7, 9, 6, 7),
李四 = c(6, 8, 7, 8, 6)
) %>%
pivot_longer(-category, names_to = "person", values_to = "score")
ggplot(skills, aes(x = category, y = score, group = person)) +
geom_polygon(aes(color = person), fill = NA, size = 1.5, alpha = 0.1) +
geom_point(aes(color = person), size = 3) +
coord_polar() +
theme_minimal() +
labs(x = NULL, y = NULL)
+ geom_hline(yintercept = seq(0, 10, by = 2), color = "gray90")
+ scale_x_discrete(limits = levels(skills$category))
+ scale_color_brewer(palette = "Set1") +
theme(panel.grid.major.x = element_line(color = "gray80"))
install.packages("ggradar")
library(ggradar)
# 需要寬格式數據
skills_wide <- skills %>%
pivot_wider(names_from = person, values_from = score)
ggradar(
skills_wide,
values.radar = c("0", "5", "10"),
grid.min = 0, grid.mid = 5, grid.max = 10
)
ggradar(
skills_wide,
axis.labels = skills_wide$category,
group.colours = c("#1F77B4", "#FF7F0E"),
background.circle.colour = "white",
gridline.min.colour = "gray",
gridline.mid.colour = "blue",
gridline.max.colour = "gray"
)
library(fmsb)
max_min <- data.frame(
編程 = c(10, 0), 統計 = c(10, 0),
可視化 = c(10, 0), 機器學習 = c(10, 0),
溝通 = c(10, 0)
)
radar_data <- rbind(
max_min,
filter(skills_wide, 張三 == "張三") %>% select(-person),
filter(skills_wide, 李四 == "李四") %>% select(-person)
)
radarchart(
radar_data,
pcol = c("#1F77B4", "#FF7F0E"),
pfcol = scales::alpha(c("#1F77B4", "#FF7F0E"), 0.3),
plwd = 2
)
legend(
"topright",
legend = c("張三", "李四"),
bty = "n", pch = 20,
col = c("#1F77B4", "#FF7F0E"),
text.col = "grey40"
)
| 特性 | ggplot2原生方案 | ggradar方案 | fmsb方案 |
|---|---|---|---|
| 學習曲線 | 較高 | 中等 | 較低 |
| 自定義靈活性 | ★★★★★ | ★★★★ | ★★★ |
| 默認美觀度 | ★★★ | ★★★★★ | ★★★★ |
| 多系列支持 | 優秀 | 優秀 | 良好 |
| 交互式擴展能力 | 支持plotly | 有限 | 不支持 |
nba_data <- tibble(
stat = c("得分", "籃板", "助攻", "搶斷", "蓋帽"),
Curry = c(95, 15, 90, 70, 20),
Jokic = c(85, 95, 90, 65, 60)
)
ggradar(nba_data,
grid.min = 0, grid.max = 100,
group.colours = c("#FFC325", "#8BB3E9"),
legend.position = "bottom")
+ theme(axis.text.x = element_text(size = 8, vjust = -0.5))
skills <- skills %>%
group_by(category) %>%
mutate(score_scaled = scales::rescale(score, to = c(0, 10)))
geom_polygon(na.rm = TRUE)
library(plotly)
p <- ggplot(...) # 基礎ggplot對象
ggplotly(p, tooltip = c("group", "y"))
通過本文介紹的多種方法,讀者可以根據具體需求選擇最適合的雷達圖實現方案。建議初學者從ggradar開始,逐步過渡到更靈活的ggplot2原生方案。記住,好的可視化不在于形式的復雜,而在于能否清晰傳達數據洞察。 “`
注:實際使用時請根據R包版本調整代碼,部分新特性可能需要安裝開發版包。建議在繪制前先對數據進行適當的標準化處理,確保各維度數值范圍一致。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。