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

使用R语言fmsb包绘制人口增长雷达图失败,求解决方案

修复fmsb雷达图展示全球区域人口增长趋势的问题

想要用fmsb包的radarchart函数展示全球五大区域(rest、africa、china、oecd、seasia)的人口增长及未来趋势,预期将各区域作为雷达射线类别,每年的数据作为一个多边形绘制,但生成的图表效果极差。原代码如下:

library(fmsb)

rnames <- c("rest", "africa", "china", "oecd", "seasia")
y1960 <- c( 759,  283,   660,  815,   517)
y1990 <- c(1405,  630,  1177, 1109,  1006)
y2020 <- c(2041, 1341,  1439, 1369,  1605)
y2060 <- c(2533, 2905,  1333, 1446,  1934)
y2100 <- c(2441, 4280,  1065, 1400,  1689)

pop <- data.frame( y1960, y1990, y2020, y2060, y2100 )
colnames(pop) <- rnames

areas <- c(rgb(1, 0, 0, 0.25),
           rgb(0, 1, 0, 0.25),
           rgb(0, 0, 1, 0.25),
           rgb(0, 1, 1, 0.25),
           rgb(1, 0, 1, 0.25))

radarchart(pop,
           cglty = 1,
           cglcol = "gray",
           plwd = 2,
           plty = 1,
           pfcol = areas)

问题根源

fmsb的radarchart函数有硬性数据格式要求:

  • 每一列对应一个雷达射线的类别(即你要展示的五大区域)
  • 每一行对应一个要绘制的多边形(即各年份的人口数据)
  • 必须在数据框前两行分别定义每个类别的最大值和最小值(函数会基于这两行做归一化,没有的话会自动用现有数据极值,但结构错了就会彻底混乱)

你原代码把区域设为列、年份设为行,但没加极值行,且函数默认把每行(年份)当成变量、每列(区域)当成多边形,完全搞反了逻辑,所以图表异常。


修复方案

步骤1:调整数据结构并添加极值行

把年份作为行名,区域作为列,再在数据框顶部添加最大值、最小值两行,确保雷达图刻度范围正确。

步骤2:重新调用radarchart

此时每行(年份)对应一个多边形,每列(区域)对应一条雷达射线,完全符合你的需求。

修改后的代码:

library(fmsb)

# 整理数据:年份为行名,区域为列
pop_data <- data.frame(
  rest = c(759, 1405, 2041, 2533, 2441),
  africa = c(283, 630, 1341, 2905, 4280),
  china = c(660, 1177, 1439, 1333, 1065),
  oecd = c(815, 1109, 1369, 1446, 1400),
  seasia = c(517, 1006, 1605, 1934, 1689),
  row.names = c("1960", "1990", "2020", "2060", "2100")
)

# 添加最大值、最小值行到数据框顶部
pop_radar <- rbind(
  apply(pop_data, 2, max),  # 自动计算各区域人口最大值
  apply(pop_data, 2, min),  # 自动计算各区域人口最小值
  pop_data
)

# 定义各年份多边形的填充色
areas <- c(rgb(1, 0, 0, 0.25),
           rgb(0, 1, 0, 0.25),
           rgb(0, 0, 1, 0.25),
           rgb(0, 1, 1, 0.25),
           rgb(1, 0, 1, 0.25))

# 绘制雷达图
radarchart(pop_radar,
           cglty = 1,
           cglcol = "gray",
           plwd = 2,
           plty = 1,
           pfcol = areas,
           title = "全球五大区域人口增长趋势(1960-2100)",
           vlcex = 0.8)  # 调整区域标签字号

# 添加图例,区分不同年份的多边形
legend("topright", legend = rownames(pop_data), fill = areas, bty = "n", cex = 0.8)

额外说明

  • 现在雷达图每条射线对应一个区域,每个彩色多边形对应一个年份的人口规模,能清晰对比各年份不同区域的人口变化
  • 你也可以手动设置极值(比如统一设为c(5000, 0)),让刻度更规整
  • 图例能明确区分不同年份的多边形,避免混淆

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:02:46