如何在ggradar中将坐标轴转换为对数刻度?
问题描述
我正在使用ggradar绘制雷达图,数据值范围从0.1到450。我设置了5作为临界值以突出显示大于该数值的点,因此配置了values.radar=c(0,5,500)、grid.max=500、grid.min=0、grid.mid=5。但我希望grid.mid与grid.min之间留有足够空间,因此考虑将坐标轴转换为对数刻度,请问有实现该需求的方法吗?非常感谢!
我的代码
library(ggplot2) library(ggradar) dggradartest <- read.table("dggradartest 2.csv",sep=",",header=T,row.names=1) ggradar(dggradartest, grid.max = 500, grid.min = 0, grid.mid = 5, base.size = 15, font.radar = "arial", values.radar = c(0, 5, 500), axis.labels = centre.y = -300, plot.extent.x.sf = 1, plot.extent.y.sf = 1, x.centre.range = 1, label.centre.y = FALSE, grid.line.width = 1, grid.label.size = 0, axis.label.size = 0, group.line.width = 0.1, gridline.min.linetype = "solid", gridline.mid.linetype = "solid", gridline.mid.colour = "blue", axis.label.offset = 1.15, axis.line.colour = NA, background.circle.colour = "grey", background.circle.transparency = 0.1)
当前生成的图表

数据集
> dput(dggradartest) structure(list(X0 = 0L, X1 = 50L, X2 = 100L, X3 = 115L, X4 = 200L, X5 = 250L, X6 = 1L, X7 = 35L, X8 = 450L, X9 = 2L, X10 = 0.5, X11 = 3L, X12 = 54L, X13 = 48L, X14 = 1.5, X15 = 1L, X16 = 0.1, X17 = 4L, X18 = 10L), class = "data.frame", row.names = "Score")
解决方案
ggradar本身没有直接支持对数刻度的参数,但可以通过对数据做对数转换+自定义刻度标签的方式模拟对数刻度效果,具体步骤如下:
- 处理数据中的0值:对数函数无法处理0,将0替换为极小值(比如0.01,小于你的最小数据0.1)。
- 对所有数据取对数(常用对数或自然对数均可)。
- 计算原刻度对应的对数值,作为雷达图的网格参数。
- 自定义雷达图的刻度标签,显示原数值而非对数后的值,保证可读性。
实现代码
library(ggplot2) library(ggradar) # 加载数据集 dggradartest <- structure(list(X0 = 0L, X1 = 50L, X2 = 100L, X3 = 115L, X4 = 200L, X5 = 250L, X6 = 1L, X7 = 35L, X8 = 450L, X9 = 2L, X10 = 0.5, X11 = 3L, X12 = 54L, X13 = 48L, X14 = 1.5, X15 = 1L, X16 = 0.1, X17 = 4L, X18 = 10L), class = "data.frame", row.names = "Score") # 替换0值并做常用对数转换 dggradartest_log <- log10(replace(dggradartest, dggradartest == 0, 0.01)) # 计算原刻度对应的对数值 log_min <- log10(0.01) # 对应原0的位置 log_mid <- log10(5) # 原临界值5的对数值 log_max <- log10(500) # 原最大值500的对数值 # 绘制对数刻度雷达图 ggradar(dggradartest_log, grid.max = log_max, grid.min = log_min, grid.mid = log_mid, base.size = 15, font.radar = "arial", values.radar = c("0", "5", "500"), # 显示原数值刻度 axis.labels = colnames(dggradartest), # 补全轴标签参数 centre.y = -300, plot.extent.x.sf = 1, plot.extent.y.sf = 1, x.centre.range = 1, label.centre.y = FALSE, grid.line.width = 1, grid.label.size = 4, # 显示网格标签 axis.label.size = 3, group.line.width = 0.1, gridline.min.linetype = "solid", gridline.mid.linetype = "solid", gridline.mid.colour = "blue", axis.label.offset = 1.15, axis.line.colour = NA, background.circle.colour = "grey", background.circle.transparency = 0.1)
注意事项
- 若偏好自然对数,只需将
log10替换为log,同步调整所有对数计算的部分即可。 - 替换0的极小值可根据数据范围调整,只要小于最小非0数据即可。
values.radar设置为原数值的字符串,确保图表显示的是用户熟悉的原始刻度。
内容的提问来源于stack exchange,提问作者Cal
相关产品推荐
相关产品推荐

