如何用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
相关产品推荐
相关产品推荐

