我正在尝试使用radarchart {fmsb}显示我的数据。我的记录的值是高度可变的。因此,低值在最终绘图上不可见。

是否有“释放”每条记录的轴,以可视化数据而不受其规模影响?

虚拟示例:

df<-data.frame(n = c(100, 0,0.3,60,0.3),
               j = c(100,0, 0.001, 70,7),
               v = c(100,0, 0.001, 79, 3),
               z = c(100,0, 0.001, 80, 99))

      n     j       v       z
1 100.0 100.0 100.000 100.000   # max
2   0.0   0.0   0.000   0.000   # min
3   0.3 0.001   0.001   0.001   # small values -> no visible on final chart!!
4  60.0 0.001  79.000  80.000
5   0.3   0.0   3.000  99.000

创建雷达图
require(fmsb)
radarchart(df, axistype=0, pty=32, axislabcol="grey",# na.itp=FALSE,
           seg = 5, centerzero = T)

结果:(仅可见第2行和第3行,不可见具有低值的第1行!!)

R雷达图: free axis to enhance records display?-LMLPHP

如何使所有记录(行)可见,即如何“释放”我的任何记录的轴?非常感谢,

最佳答案

如果您希望确保看到所有4个维度,不管有什么不同,都需要对数刻度。

由于根据雷达图的设计,我们不能有负值,我们只能通过值的范围和分段数(轴刻度)来限制基准的选择。

如果我们想要一个整数基数,我们可以选择的最小值是:

seg0 <- 5 # your initial choice, could be changed
base <- ceiling(
  max(apply(df[-c(1,2),],MARGIN = 1,max) / apply(df[-c(1,2),],MARGIN = 1,min))
  ^(1/(seg0-1))
  )

在这里,我们有一个基本的5

让我们规范化和转换我们的数据。

首先,我们通过将所有系列的最大值设置为1来标准化数据,然后应用对数转换,这会将每个系列的最大值设置为seg0(黑色为n,其他系列为z),而所有系列中的最小值介于1和2(此处为黑色系列的v值)。
df_normalized <- as.data.frame(df[-c(1,2),]/apply(df[-c(1,2),],MARGIN = 1,max))
df_transformed <- rbind(rep(seg0,4),rep(0,4),log(df_normalized,base) + seg0)
radarchart(df_transformed, axistype=0, pty=32, axislabcol="grey",# na.itp=FALSE,
           seg = seg0, centerzero = T,maxmin=T)

如果我们看一下绿色系列,我们会看到:
  • jv具有相同的数量级
  • n约为5^2 = 25乘以比j小(5是基数的值,^22分段的值)
  • v大约等于5^2 = 25倍(再次)比z


  • 如果我们看一下黑色系列,我们会看到n大约比其他维度大3.5^5倍。

    如果我们看红色系列,我们会发现所有维度之间的数量级是相同的。

    关于R雷达图: free axis to enhance records display?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47340268/

    10-11 09:31