maycca
maycca

Reputation: 4090

R radarchart: free axis to enhance records display?

I am trying to display my data using radarchart {fmsb}. The values of my records are highly variable. Therefore, low values are not visible on final plot.

Is there a was to "free" axis per each record, to visualize data independently of their scale?

Dummy example:

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

Create radarchart

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

Result: (only rows #2 and #3 are visible, row #1 with low values is not visible !!)

enter image description here

How to make visible all records (rows), i.e. how to "free" axis for any of my records? Thank you a lot,

Upvotes: 5

Views: 1196

Answers (4)

caot
caot

Reputation: 3328

Here is an example using 10-th root transformation:

library(specmine)
df.c<-data.frame((df)^(1/10)) # transform dataset

radarchart(df.c, axistype=0, pty=32, axislabcol="grey",# na.itp=FALSE,
       seg = 5, centerzero = T)`

and the result will look like this: enter image description here

You can try n-th root for find the one that is best for you. N grows, the root of a number nearby zero grows faster.

Upvotes: 0

Ron
Ron

Reputation: 393

Here an example using a cubic root transformation:

library(specmine)
df.c<-data.frame(cubic_root_transform(df)) # transform dataset

radarchart(df.c, axistype=0, pty=32, axislabcol="grey",# na.itp=FALSE,
           seg = 5, centerzero = T)`

and the result will look like this: radarchart example

EDIT:
If you want to zoom the small values even more you can do that with a higher order of the root.
e.g.

t<-5    # for fifth order root
df.t <- data.frame(apply(df, 2, function(x) FUN=x^(1/t)))  # transform dataset 
radarchart(df.t, axistype=0, pty=32, axislabcol="grey",# na.itp=FALSE,
        seg = 5, centerzero = T)

root_transformation_5

You can adjust the "zoom" as you want by changing the value of t So you should find a visualization that is suitable for you.

Upvotes: 1

moodymudskipper
moodymudskipper

Reputation: 47330

If you want to be sure to see all 4 dimensions whatever the differences, you'll need a logarithmic scale.

As by design of the radar chart we cannot have negative values we are restricted on our choice of base by the range of values and by our number of segments (axis ticks).

If we want an integer base the minimum we can choose is:

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))
  )

Here we have a base 5.

Let's normalize and transform our data.

First we normalize the data by setting the maximum to 1 for all series,then we apply our logarithmic transformation, that will set the maximum of each series to seg0 (n for black, z for others) and the minimum among all series between 1 and 2 (here the v value of the black series).

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)

plot

If we look at the green series we see:

  • j and v have same order of magnitude
  • n is about 5^2 = 25 times smaller than j (5 i the value of the base, ^2 because 2 segments)
  • v is about 5^2 = 25 times (again) smaller than z

If we look at the black series we see that n is about 3.5^5 times bigger than the other dimensions.

If we look at the red series we see that the order of magnitude is the same among all dimensions.

Upvotes: 5

Ron
Ron

Reputation: 393

Maybe a workaround for your problem: If you would transform your data before running radarchart (e.g. logarithm, square root ..) then you could also visualise small values.

Upvotes: 3

Related Questions