如何将指定DataFrame转换为雷达图?双变量同图绘制疑问
解决雷达图绘制问题:Adams和Onuachu对比
核心问题分析
你遇到的两个问题根源都是数据格式不匹配radarchart的要求:
- 调用
radarchart(dat)报错非数值型值:因为Player列是字符型,函数默认把所有列都当作雷达维度,字符列无法处理。 - 删除
Player列后图表异常:大概率是数据的行/列逻辑搞反了——radarchart要求每一行对应一个要绘制的主体(球员),每一列对应雷达的一个维度(各项统计指标),如果删完Player列后行是指标、列是球员,就会画出奇怪的图。
分步解决代码
假设你的原始数据框叫dat,结构是第一列Player,后面是各项数值指标:
- 整理数据结构
把Player列设为行名,保留数值指标列,确保所有指标都是数值型:
# 提取数值列,把Player设为行名 df <- dat[, -1] rownames(df) <- dat$Player # 强制转换所有列为数值(防止有隐形字符型数值) df <- as.data.frame(lapply(df, as.numeric))
- 绘制正常雷达图
以fmsb包的radarchart为例,指定颜色区分两个球员,调整样式:
library(fmsb) # 给数据框添加max/min行(radarchart要求首两行是各维度的max和min) df <- rbind(apply(df, 2, max), apply(df, 2, min), df) # 绘制雷达图 radarchart(df, axistype = 1, # 带刻度标签的坐标轴样式 pcol = c("darkblue", "darkred"), # 球员线条颜色 pfcol = adjustcolor(c("darkblue", "darkred"), alpha.f = 0.2), # 填充区域透明度 plwd = 2, # 线条粗细 cglcol = "gray", # 网格线颜色 cglty = 1, # 网格线类型 axislabcol = "black", # 坐标轴标签颜色 title = "Adams vs Onuachu Performance Radar") # 添加图例区分球员 legend("topright", legend = rownames(df)[3:4], col = c("darkblue", "darkred"), lty = 1, lwd = 2)
关于max/min的说明
- 上面代码里用
rbind添加的首两行,是每个维度的最大值和最小值——radarchart需要这个来确定每个轴的范围。如果想自定义范围(比如所有轴统一用0-100),可以手动构造:
# 自定义max/min行,假设所有指标范围是0到100 max_row <- rep(100, ncol(df)) min_row <- rep(0, ncol(df)) df_custom <- rbind(max_row, min_row, df) radarchart(df_custom, ...) # 其他参数同上
- 如果有反向指标(比如失误率越低越好),可以把该列的min和max反过来,或者先对该列做反向转换(比如用
100 - 原值)。
异常图表的原因
你删除Player列后,数据框的行变成了原来的统计指标(比如进球、助攻),列是球员,完全不符合radarchart的输入逻辑——它会把每一行当作一个主体绘制,自然会出现混乱图形。
内容的提问来源于stack exchange,提问作者footballstatistician
相关产品推荐
相关产品推荐

