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

如何用R绘制含因子与连续数据的多轴多尺度雷达图并计算面积占比?

实现包含因子与连续数据的多轴多尺度雷达图及面积计算(R语言)

当然可以用R实现这个需求!我来一步步给你演示怎么搞定——包括适配因子和连续数据的雷达图绘制,以及雷达图面积百分比的计算。

第一步:准备工作与数据处理

雷达图的核心要求是所有变量处于同一尺度,所以我们需要先把因子变量转换成数值,再对所有变量做归一化处理(把值映射到0-1区间)。

首先加载需要的包,处理你的示例数据:

# 安装需要的包(如果还没装)
install.packages(c("fmsb", "dplyr"))
library(fmsb)
library(dplyr)

# 你的原始数据框
df <- data.frame(
  "var.a" = .7, 
  "var.b" = 3.5, 
  "var.c" = as.factor("e"), 
  "var.d" = as.factor("f1"), 
  "var.e" = as.integer(1), 
  "var.f" = as.factor("y")
)

# 1. 把因子变量转换为数值(如果因子有多个水平,可按自定义顺序编码)
df_processed <- df %>%
  mutate(across(where(is.factor), ~ as.integer(.)))

# 2. 对所有数值变量做min-max归一化,统一到0-1区间
normalize <- function(x) { (x - min(x)) / (max(x) - min(x)) }
df_normalized <- df_processed %>%
  mutate(across(where(is.numeric), normalize))

# 3. 构造fmsb包要求的雷达图数据格式:首行是各变量最大值,次行是最小值,第三行是目标数据
radar_data <- rbind(
  rep(1, ncol(df_normalized)),  # 最大值(归一化后是1)
  rep(0, ncol(df_normalized)),  # 最小值(归一化后是0)
  df_normalized
)

第二步:绘制多轴多尺度雷达图

这里用fmsb包的radarchart()函数,它能轻松生成雷达图,同时我们可以自定义样式来区分不同变量:

radarchart(
  radar_data,
  pcol = "#2E86AB",          # 线条颜色
  pfcol = rgb(46, 134, 171, max = 255, alpha = 50),  # 填充颜色(半透明)
  plwd = 2,                  # 线条粗细
  cglcol = "gray",           # 网格线颜色
  cglty = 1,                 # 网格线类型
  axislabcol = "gray",       # 刻度标签颜色
  caxislabels = seq(0, 1, 0.2),  # 轴刻度
  vlabels = colnames(df_normalized),  # 变量名称
  title = "多轴多尺度雷达图(归一化后)"
)

如果需要在轴上标注原始变量的刻度值,可以手动添加文本(比如对var.b,归一化1对应原始值3.5,0对应0,你可以用text()函数在对应位置添加标签)。

第三步:计算雷达图面积的百分比

雷达图本质是一个多边形,我们可以用鞋带公式计算它的面积,再除以同尺度下正多边形的最大面积,得到百分比:

# 获取变量数量(雷达图的边数)
n_vars <- ncol(df_normalized)

# 计算每个轴对应的角度(弧度)
angles <- seq(0, 2*pi, length.out = n_vars + 1)[-1]

# 提取归一化后的变量值
values <- as.numeric(df_normalized)

# 转换为笛卡尔坐标(用于计算面积)
x <- values * cos(angles)
y <- values * sin(angles)

# 鞋带公式计算多边形面积
shoelace_area <- function(x_coords, y_coords) {
  n <- length(x_coords)
  abs(sum(x_coords[1:n-1] * y_coords[2:n] - x_coords[2:n] * y_coords[1:n-1]) / 2)
}

# 计算实际雷达图的面积
actual_area <- shoelace_area(x, y)

# 计算同尺度下正n边形的最大面积(半径为1时)
max_area <- (n_vars / 2) * sin(2 * pi / n_vars)

# 计算面积百分比
area_percent <- round((actual_area / max_area) * 100, 2)
cat("雷达图面积占最大可能面积的百分比:", area_percent, "%\n")

额外说明

  • 如果你的因子变量有多个水平(比如var.c有"e""f""g"),可以用factor(var.c, levels = c("e","f","g"))指定顺序,再转成数值,确保编码符合你的业务逻辑。
  • 如果你想要更美观的雷达图,也可以用ggradar包(基于ggplot2),但数据处理逻辑和上面一致,同样需要先归一化所有变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:13:55