雷达图这玩意儿,你光看名字可能觉得就是Excel里一个图表模板,但我跟你讲,在R语言里把雷达图画到“能发出去见人”的程度,中间隔着的不是代码量,是一堆参数调校和对数据格式的理解。我这次是用NBA季后赛球员数据做底,对比了约基奇、字母哥、恩比德、塔图姆这些球员的得分、篮板、助攻、抢断、盖帽、效率值和使用率,最后用ggradar出了几张能直接放进分析报告里的图。整个过程从装包到踩坑再到出图,今天一次性写明白,给做R语言数据可视化的朋友一个完整参考。
1. 为什么雷达图适合做球员数据对比:一个多指标可视化的真实需求
先说清楚我为什么放着现成的柱状图不用,非要折腾雷达图。事情是这样的,当时我手头有五个球员的七项数据,想在一张图里直观看出“谁更全面”“谁的短板明显”。柱状图当然能画,但七个指标就要画七张图,对比起来脑子里得强行拼装信息;折线图能把球员当横轴、指标当纵轴,但多指标放在同一坐标系里,量纲不同,得分和抢断根本没法同轴比较,画出来就是一坨贴地的线。热力图也能上,但看热力图更多是“查数值”,看不出能力结构的形状。
雷达图的优势恰恰在这个场景下突显出来。它把每个指标映射到从圆心向外辐射的轴上,同轴、同心圆、统一比例,一个球员就是一条闭合多边形,多画几个球员就能在同一个图形空间里做形态对比。信息密度高是它最值钱的地方:一张图能承载六到八个指标,还能通过多边形的面积、形状、边角位置快速识别球员特征。
NBA球员评估这个场景尤其适合。你看球探报告里评价一个球员,从来不是单看得分,而是看综合分析——得分能力、组织能力、篮板保护、防守贡献、效率、球权使用率,维度多且互不替代。雷达图天然地匹配这种评估逻辑。
不过雷达图也不是万能的,我一开始理解得太理想化,后来用多了才发现几个边界:
- 变量数量控制在5-8个。超过8个,外圈标签密集,多边形线条重叠,图直接没法读。
- 适合看形态,不适合精确读数。雷达图看趋势和结构很强,但某个球员的助攻到底比另一个高0.7还是0.9,单看雷达图根本分辨不出来,得出图后另外配数据表。
- 指标之间必须同尺度或归一化。不归一化,得分(20-30)和抢断(1-2)画在同一个轴系里,小数值指标贴在内圈,等于白画。
- 不适合大样本横截。雷达图适合5-10个对象的对比,你要拿它跑30个球员,那是给自己找麻烦。
明确了这些边界之后,我才放心用雷达图来做这组球员对比。工具选定是ggradar——R语言里基于ggplot2生态的一个雷达图扩展包,能出比较漂亮的静态图,我后面所有代码和调试都是围绕它来的。
2. 环境准备与ggradar安装:CRAN停更后的三种安装路径
大多数R包安装就是一行install.packages("包名"),但ggradar有个特殊情况——它在CRAN上已经停更归档了。我第一次跑这行命令,直接报错,提示“package ‘ggradar’ is not available for this version of R”,当时还以为是版本问题,查了一圈才知道是包被CRAN移除了,只能走GitHub渠道。
先说环境基础:R语言版本4.2以上、RStudio建议装一个,绘图调试体验好很多。这些基础的我就默认你会了,直接讲安装。
2.1 三种安装方式
方式一:直接从GitHub安装(推荐)
if (!requireNamespace("remotes")) { install.packages("remotes") } remotes::install_github("ricardo-bion/ggradar", dependencies = TRUE)这是我在用的安装方式。作者ricardo-bion维护的GitHub仓库是目前ggradar的主要分发渠道,dependencies=TRUE会帮你把ggplot2、dplyr、scales这些依赖包一并装好。
方式二:CRAN存档安装(不推荐,备选)
万一GitHub源不稳定或者网络不通,可以尝试从CRAN归档安装。但你要自己找对应R版本的源码包,又得手动处理依赖,现代R开发流程里除非特殊环境,我不建议走这条路。
方式三:conda安装(Linux环境可考虑)
如果你用conda管理R环境,可以试试conda install -c r r-ggradar。但conda源的更新往往滞后,我在实测中遇到过版本过旧导致无法兼容新版ggplot2的问题,所以这个方式适合已经有conda环境的用户,不建议为了装包单开一条路。
2.2 安装报错的排查思路
我实际装的过程也不是一路顺畅,遇到报错先别慌,按下面顺序排查:
依赖包版本冲突。ggradar开发较早,对新版ggplot2可能存在兼容性问题,如果报错里出现“package ‘ggplot2’ was installed before R 4.0.0”之类的提示,先把依赖更新到最新:
update.packages(ask = FALSE),再重新安装。缺少系统编译工具。Windows用户装GitHub包通常没问题,但如果你的R没有配置Rtools,碰到需要编译的依赖就会报“no such file or directory”之类的错误。装一下Rtools对应版本,问题基本解决。
网络问题导致下载失败。这个没什么好办法,换个网络或者配置镜像重试。GitHub下载偶尔会中断,多试两次就好。
2.3 为什么选ggradar而不是fmsb / radarchart
安装前我也对比过其他几个雷达图的R包,简单列个表给后来的人参考:
| 包名 | 底层 | 安装难度 | 可定制性 | 典型场景 |
|---|---|---|---|---|
| fmsb | base图形 | 低 | 中 | 快速出图,对美观要求不高 |
| ggradar | ggplot2 | 中 | 高 | 报告级静态图 |
| radarchart | htmlwidgets | 低 | 低 | 交互式网页展示 |
| ggiraphExtra::ggRadar | ggplot2 | 低 | 中 | 需要分面组图时 |
我最终选ggradar核心是两个理由:一是基于ggplot2,意味着它能融入ggplot2主题体系,字体、配色、图例、导出这些都能统一风格;二是它对多系列(多个球员)的对比支持得相对完整,一条线一个颜色,图例自动生成,这正好是fmsb比较弱的地方。fmsb画单系列还行,多系列对比时你得手动控制很多细节,代码写起来冗长且效果不稳定。
ggradar停更这个事,很多人一听就走开了,实际用下来我觉得问题不大。它核心功能已经足够稳定,和当前ggplot2版本的兼容性经过了大量用户验证,只要不走特别冷门的边缘功能,完全能满足日常出图需求。这个选择的性价比,在我后面跑通全流程之后更加确认。
3. 季后赛数据收集与预处理:指标选择、量纲统一与数据格式陷阱
雷达图画得丑,八成问题不在绘图代码,在数据进了绘图函数之前的状态。这一节是全文最容易被跳过但最值得细看的部分,我按数据落地的顺序把整个过程拆开讲。
3.1 数据来源与指标选择
数据方面,我用的是2023-2024赛季NBA季后赛阶段的球员公开统计,从篮球数据网站手工整理的示例数据。这里先说明一下,这组数据主要用于演示绘图流程,不代表任何官方统计口径,也不负责跨赛季边界的口径一致性。你要是想用最新赛季数据,思路完全一样,替换数据源即可。
我选了五名球员:约基奇、字母哥、恩比德、塔图姆、亚历山大,每个球员取七项指标:
- PTS:场均得分,衡量进攻火力
- TRB:场均篮板,衡量内线对抗和篮板保护
- AST:场均助攻,衡量组织能力
- STL:场均抢断,衡量外线防守压迫
- BLK:场均盖帽,衡量护框能力
- eFG%:有效命中率,衡量投篮效率
- USG%:使用率,衡量球权集中度
选这七项的逻辑是尽量覆盖进攻、防守、效率、球权四个维度,且每项都有独立信息,不重复。比如得分和有效命中率有的人会觉得重复,实际上一个球员可能场均30分但命中率偏低(高出手低效率),另一个场均22分但命中率高(低出手高效率),这两个指标的组合恰恰能区分“数据刷子”和“高效得分手”。
数据整理成R的数据框:
library(tibble) playoff_stats <- tibble::tribble( ~player, ~PTS, ~TRB, ~AST, ~STL, ~BLK, ~eFG., ~USG., "约基奇", 28.7, 13.4, 8.7, 1.3, 1.1, 0.58, 27.9, "字母哥", 31.2, 11.8, 6.2, 1.4, 1.5, 0.57, 32.4, "恩比德", 32.4, 10.7, 5.9, 1.1, 1.8, 0.55, 34.2, "塔图姆", 25.3, 8.6, 5.2, 1.1, 0.9, 0.53, 30.1, "亚历山大", 29.8, 5.6, 6.0, 2.0, 1.0, 0.56, 29.6 )这里有一个很容易被忽视的细节:列顺序就是雷达图上变量的排列顺序。我按PTS、TRB、AST、STL、BLK、eFG.、USG.的顺序放,出图时变量就按这个顺序顺时针排列。你如果想调整变量在雷达图上的位置,直接在数据框里调列的顺序就行,不需要改绘图代码。
3.2 归一化:雷达图最关键的预处理
量纲统一是我这次操作中体会最深的一环。直接看这组数据的量级:得分是25-32,篮板是5-13,助攻是5-9,抢断和盖帽是1-2,有效命中率是0.53-0.58,使用率是27-35。这些数值不在一个数量级上,如果直接丢进ggradar,得分和使用率这两个高量级指标会占据几乎整个半径,抢断盖帽这种小数值指标会全部缩在内圈,图形完全失衡。
解决方法是min-max归一化到[0,1],让每个指标的最小值为0、最大值为1。为什么不用z-score?因为z-score会产生负值,而ggradar的坐标轴设计对负值支持不好,负值会画到反向轴上去,所以最稳妥的还是缩放到0-1区间。
library(dplyr) library(scales) playoff_scaled <- playoff_stats %>% mutate(across(c(PTS, TRB, AST, STL, BLK, eFG., USG.), rescale))scales::rescale()默认将向量缩放到0-1,一行代码搞定所有指标。归一化之后的含义也很清晰:某球员某项指标为1,说明在这一组对比对象中该项指标最强;为0说明该项最弱。雷达图外圈是“组内最强”,内圈是“组内最弱”。
3.3 数据格式要求与常见错误
ggradar对输入数据格式的要求比一般ggplot2函数严格,踩过一次之后你就能记住:
- 第一列必须是非数值的分组变量(球员名),剩余列必须全部是数值变量。
- 所有列不允许有缺失值。哪怕一个NA,ggradar都会直接报错,图层画不出来。
- 数值变量必须是numeric类型,不能是character。很多人从CSV读入数据后,数字列被自动识别成字符,str()一看才发现问题,得先
mutate(across(everything(), as.numeric))转一圈。 - 列数(指标数)不要太少也不要太多。少于3个,雷达图画出来就是一条线,没有“面”的视觉意义;多于10个,图标签密到没法看。5-8个是舒服区间。
我当时在数据格式上栽过一个小跟头:导入CSV之后,有效命中率那列因为原始数据里写的是“58%”这种格式,被R读成了字符型。整个绘图脚本跑一遍报错,排查了二十分钟才发现是类型问题。所以建议你从一开始就用干净的数值格式,百分比就写0.58而不是58%,减少后面转换的麻烦。
预处理完的数据长这样:
> playoff_scaled # A tibble: 5 x 8 player PTS TRB AST STL BLK eFG. USG. <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 约基奇 0.521 1 1 0.222 0.222 1 0 2 字母哥 0.887 0.897 0.556 0.333 0.667 0.8 0.54 3 恩比德 1 0.744 0.389 0 1 0.4 1 4 塔图姆 0 0.462 0 0 0 0 0.31 5 亚历山大 0.69 0 0.296 1 0.111 0.6 0.25看到没,塔图姆作为这一组里得分最低、各项也相对靠后的球员,归一化之后多项指标是0或接近0,这在雷达图上就是靠内圈的多边形。这不是数据错误,而是“组内相对位置”的直观体现。理解这一点,后面读图才有方向。
4. ggradar核心绘图逻辑:从基础调用到参数逐项拆解
数据准备好之后,绘图本身反而不复杂。ggradar的设计哲学是“用一个函数把所有事情做完”,所以核心就是一次调用,大批外观参数在函数内部配置。
4.1 第一版代码:跑通再说
library(ggradar) ggradar( playoff_scaled, values.radar = c("0", "0.5", "1"), gridline.min.linetype = 1, gridline.mid.linetype = 1, gridline.max.linetype = 1, group.colours = c("#E64B35", "#00A087", "#3C5488", "#F39B7F", "#4DBBD5"), group.line.width = 1.2, group.point.size = 2.5, background.circle.colour = "grey90", legend.position = "bottom" )这一版跑出来,五个球员的五条多边形就出现在同一个坐标系里了。第一次跑通的感觉是有点惊喜的,但仔细看会发现很多细节可以调,下面把核心参数逐个说清。
4.2 核心参数详解
values.radar:网格线刻度标签,就是雷达图上三个同心圆边上标的“0、0.5、1”。因为数据已经归一化到0-1,这里直接对应三个刻度点。如果你的数据没有归一化,而你想保持原始量纲,这里就要改,但我反复建议还是归一化,刻度标签也更干净。
gridline.min/mid/max.linetype:同心圆的线型,全部设为1(实线)会让网格整体更简洁。默认是虚线,虚线网格在视觉上会抢多边形的注意力,建议统一实线。
group.colours:每个球员的颜色向量,长度必须和分组数一致。我用的这组颜色来自学术期刊常用配色(经典NPG色系),色相差异大、对色盲也相对友好。如果你不指定,ggradar会用ggplot2默认调色板,但那个调色板在5个类别时容易颜色相近,建议手动指定。
group.line.width、group.point.size:线条粗细和顶点圆点大小。我实测下来,线宽1.2-1.5、点大小2.5-3在导出后最清晰,太细的线导出PNG后会有断裂感,太大则让图显得笨重。
background.circle.colour:背景圆的颜色,默认是灰的,设成“grey90”就是很淡的浅灰,既能和网格区分,又不会压制多边形。
legend.position:图例位置,我放在底部。5个球员时底部放图例最自然,顶部会让图头重脚轻,右侧则会压缩主图的横向空间。
4.3 变量顺序与显示顺序的坑
前面提过,ggradar中变量的显示顺序完全由数据框的列顺序决定,不是自动按字母序或按数值排序。这个特性和ggplot2里因子顺序的逻辑类似,牢记“列序即轴序”就行。
具体操作:
# 调整列顺序,让有效命中率排到第一位 playoff_scaled <- playoff_scaled %>% select(player, eFG., PTS, TRB, AST, STL, BLK, USG.)这样雷达图上的第一个轴(正上方起点)就变成了有效命中率,其他变量按顺时针顺序依次排列。正上方的变量在视觉上最容易被注意,所以一般把最重要的指标放第一列。
4.4 一个值得注意的点:axis.label.offset
第一次画出来,我还发现轴标签“PTS”“TRB”这些文字紧贴着最外圈的网格线,多边形的顶点和标签挤在一起,观感不够清爽。调整一下标签离圆心的距离:
ggradar( playoff_scaled, values.radar = c("0", "0.5", "1"), axis.label.offset = 1.2, # 默认1.15,稍微外移 ... )axis.label.offset就是控制变量标签离圆心距离的比例参数,数值越大标签越靠外。这个参数网上中文资料里讲得很少,但我实际调试下来它对整体可读性的影响非常大,尤其是指标数较多、标签较长的时候。
4.5 返回对象是ggplot对象,可以继续叠加
ggradar的返回值本身是一个ggplot对象,这意味着基础的ggplot2主题系统是可以继续叠加的。举个例子:
p <- ggradar(playoff_scaled, ...) p + theme( plot.title = element_text(size = 16, face = "bold"), legend.text = element_text(size = 10) )不过有个前提,雷达图的坐标系和网格线是ggradar内部封装好的,你能改的主要是标题、图例、字体、背景这些外围元素,不能指望像普通ggplot2图一样随意添加图层元素。真正需要深度定制的时候,还是得基于ggplot2重写雷达图,这个咱们在后面的进阶部分讲。
5. 踩坑实录:分面失效、尺度失衡与中文乱码的完整排查链路
这一节写的都是我这次实操中真实遇到并解决的问题。说句实话,网上的教程能让你“画出一个图”,但真正阻碍你把图用到工作流里的,恰恰是这些教程不会提前告诉你的细节问题。
5.1 坑一:分面操作直接失效
问题现象:我一开始想把五个球员分面展示,形成“一人一宫格”的效果,于是给ggradar返回的ggplot对象加了facet_wrap(~player),结果返回的还是单个雷达图,坐标轴错乱,完全不能看。
排查过程:我先怀疑是自己的代码姿势问题,试了几种facet调用方式都一样。然后打开ggradar源码看到它内部用的是coord_radar(),这是一个非标准的ggplot2坐标系扩展。关键问题在于:ggradar的coord_radar坐标系与facet机制在底层不兼容,两者组合起来坐标系无法正确按面板拆分,才会出现错乱。
解决思路:正交方案是放弃ggradar的分面,直接放弃在同一个坐标空间里同时呈现所有球员。如果必须要分面效果,换成ggiraphExtra::ggRadar(),它对分面的支持比较好。或者干脆回到全组合图——多个球员画在同一张雷达图上本来也是雷达图的主要用法,分面并不是必须。
5.2 坑二:不同量纲指标导致图形压扁
问题现象:这是我能跑通代码之后遇到的最大的一个坑。我一开始图省事,把原始统计值直接丢给ggradar,没有归一化。出来的图,得分和使用率两个变量几乎撑满了整个外圈,篮板助攻挤在中间,抢断盖帽全部贴在内圈,五条多边形挤成一堆,完全没法区分。
排查过程:这次排查其实是和数据结构一起查的。我打印了传给ggradar的数据,发现PTS一列是28-32,USG.一列是27-35,而STL和BLK是1-2之间,量级差了一个数量级。在雷达图这种同心圆结构里,不同变量应该在同一个尺度空间内比较才有意义,否则小数值指标的差异根本看不出来。
解决思路:回到预处理阶段做min-max归一化,这是雷达图使用的基本前提,不归一化就是在浪费自己的时间。
5.3 坑三:中文标签乱码
问题现象:RStudio里看图形窗口,球员名“约基奇”这些中文标签显示一切正常,但ggsave导出PNG图片之后,中文全部变成了方框,图直接废了。
排查过程:典型的中文字体渲染问题。RStudio图形窗口有自己的一套字体渲染机制,和导出设备的字体映射不一致。ggplot2体系在Windows上导出图片时,默认设备对中文字体的支持不完整。
解决思路:最省事也最保险的办法是把标签改成英文或拼音,比如“约基奇”改成“Jokic”,“字母哥”改成“Giannis”。如果你必须保留中文,有两个方案:
方案一,导出时用Cairo设备:
ggsave("radar_chart.png", width = 9, height = 7, dpi = 300, device = cairo_pdf)或者先输出PDF再转图片,PDF对字体嵌入的支持更好。但坦白说,在国际赛事数据这种场景下,用英文名反而是更规范的选择。这里也顺便提醒一句:体育数据分析报告里,球员名、球队名建议统一用英文或官方缩写,避免字体问题和跨平台显示不一致。
5.4 坑四:图例颜色区分度不足
问题现象:五个球员的默认图例颜色中有两个比较接近,刚开始快速扫图的时候,我会认错哪条线是哪个球员。
排查过程:这是ggplot2默认调色板在类别数超过4个时的老问题。默认色板在数量少时确实好用,但到了5个及以上类别,色相之间的区分度会明显下降,尤其导出后经过缩放,颜色更接近。
解决思路:用group.colours手动指定一组对比度高的颜色。我这里用的是NPG学术配色,具体色值如下:
group.colours = c( "约基奇" = "#E64B35", "字母哥" = "#00A087", "恩比德" = "#3C5488", "塔图姆" = "#F39B7F", "亚历山大" = "#4DBBD5" )用命名向量指定颜色还有一个好处:不管数据行顺序怎么变,颜色和球员的对应关系始终稳定。
5.5 坑五:ggsave导出后的图片锯齿感
问题现象:我出图的时候直接用了默认的导出设置,结果PNG放大后锯齿明显,线条边缘发毛,线宽也时粗时细。
排查过程:问题出在导出分辨率太低。当时没用ggsave,直接在RStudio的Export菜单里默认导出,那个DPI是屏幕级别的(72-96),远达不到印刷和报告要求。
解决思路:固定用ggsave,设置300dpi,并且打开抗锯齿渲染:
ggsave("radar_chart.png", plot = p, width = 9, height = 7, dpi = 300)导出后我会习惯放大到100%再检查一遍线条边缘和文字清晰度,这在报告交付场景里是必须的,细节不过关的图缩略图看着还行,一放大就露怯。
6. 进阶定制:让雷达图从“能看”到“能交差”
如果你只是自己跑个数,看到大概形状就够了。但雷达图这东西,放在分析报告或者展示场景里,审美细节直接决定了读者愿不愿意多看一眼。这一节我讲几个让雷达图从“能看”到“能交差”的实用技巧。
6.1 用主题统一风格
ggradar基于ggplot2,最香的特性就是可以复用主题体系。我自己封装了一个简版主题:
library(ggplot2) theme_radar_custom <- function() { theme_minimal(base_size = 12) + theme( panel.grid = element_blank(), plot.title = element_text(hjust = 0.5, face = "bold", size = 15), legend.position = "bottom", legend.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank() ) } p + theme_radar_custom()设置axis.text = element_blank()是因为ggradar的坐标轴文字标签本来就通过values.radar来控制了,不关掉默认坐标轴文字的话会出现重复标签。主题统一一次,以后所有雷达图都长一个样,在报告里一致性很强。
6.2 手动指定刻度范围和网格
ggradar的网格线数量和范围由数据里的最大值决定。归一化之后最大是1,所以网格线就是0-0.5-1三条。如果你希望网格线更密,比如显示0、0.25、0.5、0.75、1,需要把数据的最大值视为1,但实际值还是原样,这其实做不到直接设定。
我的做法是:接受归一化后的0-1网格,这也是最稳妥的方式。如果你真的需要更多刻度,就得自己写代码重绘,用geom_polygon加coord_radar实现,ggradar本身不支持这个定制。
6.3 多张雷达图组合输出
上一节说了ggradar不支持facet,那如果我就是想一人一张单独看怎么办?我的方案是循环出图再拼合,或者用cowplot包拼多张独立图:
library(cowplot) library(purrr) plot_list <- map(seq_len(nrow(playoff_scaled)), function(i) { data_one <- playoff_scaled[i, ] ggradar(data_one, ...) }) plot_grid(plotlist = plot_list, ncol = 2, labels = "auto")这样每张都是独立坐标轴,变量刻度完全一致(因为都从同一个归一化后的数据框取的一行),互相之间可以严格对比,又保留了单人聚焦的阅读体验。这个方法比facet灵活得多。
6.4 图片尺寸:别让雷达图被拉扁
雷达图是圆形结构,最忌讳的是一张长方形的画布上拉伸变椭圆。我出图固定用正方形近似比例,比如9x7或者8x7,保证圆形基本形变。如果你用ggplot2的coord_fixed也可以强制纵横比,但ggradar已经内置了coord_radar,画布比例不合适时图形会被拉伸。尺寸规范和指标数量有关:指标越多,标签越往外,越需要更大的画布高度来容纳标签。
7. 从雷达图到分析结论:以NBA球员对比为例的实战解读
图出来了不是终点,还得讲得清。雷达图的核心阅读逻辑是看两件事:多边形面积和形状。面积大说明各指标整体水平高,形状说明能力结构的倾向性。整张图放在一张里,有几个解读角度非常明显。
7.1 约基奇:接近“圆”的多边形
约基奇在归一化之后的先发数据里,助攻、篮板都是组内峰值1.0,效率值也到了1.0,得分0.52,使用率反而只有0。逐项看的话,他的多边形在AST、TRB、eFG.三个方向撑得很满,整体形状比较圆润,这正是“全面”的视觉特征。在雷达图上找“哪个球员最均衡”,就是找“哪个多边形最接近圆”。
7.2 字母哥与恩比德:高使用率的得分手
字母哥的得分0.887、篮板0.897接近满格,使用率0.54也在中上区间,但STL只有0.333,BLK是0.667,形状在抢断方向上有个明显内缩。恩比德的得分到了1.0、盖帽1.0,强项极强,但助攻0.389、抢断0,弱项也极弱,多边形有明显的“尖角”。这两个球员的雷达图放在一起看,能很清楚地看到两种不同的内线风格。
7.3 解读时的几个注意点
第一,雷达图的“外圈”是组内最强,不是联盟最强。恩比德得分归一化到1.0,只是说他在这个五人组里得分数据最高,不意味着他是全NBA季后赛得分王。第二,面积不是唯一的判断依据,一个所有指标都在0.7-0.8的球员,面积可能比一个0.9和0.2两极分化的球员更大,但前者是稳定全面,后者是有明显特色,这两种球员在不同战术体系里价值不同。第三,雷达图展示的是相对关系,精确数值始终要回到数据表里核对。
7.4 报告中怎么用雷达图
在分析报告里,雷达图的最佳位置是“概述页”,让读者快速了解对比对象的能力结构,具体的数值分析放在后面的表格和图里。我记得有一次报告评审,对方只看了一眼雷达图就指出了哪两个球员的特点最接近,这就是雷达图的效率——把复杂的多指标对比压缩成视觉上的一眼信息。
我自己在报告里一般这样搭配:雷达图负责“看形态”,配套一个指标明细表格负责“读数值”,两者缺一不可。如果只有雷达图,读者无法拿到精确差异;如果只有表格,读者无法快速形成整体印象。这也是我在多次实践中总结的比较稳的输出方式。
最后说一个我个人的体会。雷达图真正难的不是代码,是你在画之前想清楚“要给谁看、看什么结论、哪些指标能支撑这个结论”。ggradar可以帮你把图画出美感,但能不能讲出一个有信息量的故事,靠的是对数据的理解和对可视化边界的把握。我在这次NBA数据的例子里踩过的坑,基本都集中在数据预处理和参数理解上,希望写出来的这些经验能帮你少走一段弯路。另外,如果你后续要用更灵活的雷达图做定制,可以基于ggplot2的geom_polygon自己画,原理就是把每个指标的角度坐标算出来,这个留到以后有机会再展开。