Radar/spinnenwebkaarten


Radardiagrammen zijn nog niet zo gebruikelijk als hun andere zussen en broers. Ze maken het mogelijk om de verschillen tussen de groepen voor veel variabelen tegelijk te laten zien. Ze werken goed als je een soort maximum hebt voor deze variabelen. Ook als je niet zoveel groepen hebt om te vergelijken, idealiter 2-3. En als je niet geïnteresseerd bent in de verdelingen zelf.
Toch zijn ze visueel aantrekkelijk en kunnen ze een leuk onderdeel zijn van een dynamische Shiny-toepassing.

Hieronder staat de eenvoudige code voor een radarplot voor gegevens over Parkinson-symptomen. Elk symptoom heeft een score van 0-100. Omdat de gegevens longitudinaal zijn, maakt de functie het mogelijk om ze op een bepaald tijdstip uit te zetten. Ook het ordenen op ernst is ingeschakeld.

De functie werkt voor binaire groepen.

Plot.Bin.Radar<-functie(tijdpunt,groep,order_by_severity = FALSE){

#reading symptomen data#

data.symptoms<-data.frame(ID=m.data$participant_id,slow=m.data$slow, constipation=m.data$constipation,walk=m.data$walk,freezing=m.data$freezing, falls=m.data$falls,rising=m.data$rising,dressing=m.data$dressing, motivation=m.data$motivation,handwriting=m.data$handwriting,
depression=m.data$depression,withrawn=m.data$withdrawn,
anxiety=m.data$anxiety,fatigue=m.data$fatigue,
sleepy=m.data$sleepy,dyskinesia=m.data$dyskinesia,
tremor=m.data$remor,balance=m.data$balans,
dizzy=m.data$dizzy,visual=m.data$visual,insomnia=m.data$insomnia,
rbd=m.data$rbd,restlesslegs=m.data$restlesslegs,
musclepain=m.data$musclepain,speech=m.data$speech,
drool=m.data$drool,stoop=m.data$stoop,
memory=m.data$geheugen,comprehension=m.data$begrip,smell=m.data$geur,
sexual=m.data$seksual,urinary=m.data$urinary,
hallucinaties=m.data$hallucinations,misselijkheid=m.data$nausea,tijd=m.data$TijdCont)

#where groepsvariabele in de data#
where.group<-which(names(m.data)==groep)
  
data.symptoms.0<-data.symptoms[(data.symptoms$time==timepoint)&(m.data[,where.group]==0),]
data.symptoms.12<-data.symptoms[(data.symptoms$time==timepoint)&(m.data[,where.group]==1),]
  
  
alle.symptomen.0 <- data.frame(sapply(data.symptoms.0, function(x) as.numeric(as.character(x))))
alle.symptomen.12 <- data.frame(sapply(data.symptoms.12, function(x) as.numeric(as.character(x))))
  
  
av.symp.0<-colMeans(all.symptoms.0, na.rm=TRUE)
av.symp.12<-colMeans(all.symptoms.12, na.rm=TRUE)
  
data <- as.data.frame(rbind(av.symp.0[2:34],av.symp.12[2:34]))

# sortering op ernst#
  
  if (order_by_severity) {
    # Bereken de gemiddelde ernst voor beide groepen
    mean_severity <- colMeans(data, na.rm = TRUE)
    ordered_symptoms <- names(sort(mean_severity, decreasing = TRUE))
    gegevens <- gegevens[, geordende_symptomen]
  }
  
get.labels<-names.data$Field.Label[names.data$Variable.Field.Name==groep]
  
rownames(data) <- c(paste0(" No ", timepoint,"m."),paste0(" Yes ", timepoint,"m.")
  
# Om het fmsb-pakket te gebruiken, moet ik 2 regels aan het dataframe toevoegen: de max en min van elke variabele die op de plot moeten worden weergegeven!
  
 gegevens <- rbind(rep(100,33) , rep(0,33) , gegevens)
  
# Kleurenvector (randen en vulling)#

colors_border=c( rgb(0,2,0,5,0,5,0,9), rgb(0,8,0,2,0,5,0,9) , rgb(0,7,0,5,0,1,0,9), rgb(0,1,0,1,0,9,0,9))
colors_in=c( rgb(0.2,0.5,0.5,0.4), rgb(0.8,0.2,0.5,0.4) , rgb(0.7,0.5,0.1,0.4),rgb(0.1,0.1,0.9,0.4) )
  
  # plot met standaardopties:
  radarchart( data , axistype=1 ,
              #aangepaste veelhoek
              pcol=kleuren_rand , pfcol=kleuren_in , plwd=4 , plty=1,
              #custom het raster
              cglcol="grijs", cglty=1, axislabcol="grijs", caxislabels=seq(0,20,5), cglwd=0,8, vlcex=0,8,title=get.labels)
  legenda(x=0,8, y=1,3, legenda = rownames(data[-c(1,2),]), bty = "n", pch=20 ,
         col=colors_border , text.col = "black", cex=1, pt.cex=2)
  if (order_by_severity) {
    mtext("Symptomen gerangschikt naar gemiddelde ernst over alle groepen",
          zijde = 1, lijn = 4, cex = 0.9, col = "grijs40")
  }
  
}
Plot.Bin.Radar(0,"geslacht",order_by_severity = TRUE) 

Radardiagram waarin de symptomen van mannen en vrouwen worden vergeleken.

Als resultaat van de functie Plot.Bin.Radar(0,"gender",order_by_severity = TRUE) hebben we de bovenstaande grafiek. Voor geslacht, voor 0 maanden (basislijn). Stel je nu de Shiny-app voor met tijd als schuifregelaar:

bibliotheek(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(titel = "Parkinson-dashboard"),
  dashboardSidebar(),
  dashboardBody(
    # Vakken moeten in een rij (of kolom) worden geplaatst
    fluidRow(
      box(width = 6,plotOutput("plot1", height = 450)),
      
      box(
        titel = "Basislijn vs een ander tijdstip",
        schuifregelaarInvoer("schuifregelaar", "Kies tijdstip:", 0, 24, 6)
      )
    )
  )
)

server <- functie(invoer, uitvoer) {
  
 bibliotheek(fmsb)
 
  
  jouw.data <- read.csv("mydata.csv")
  #doe hier wat gegevensbeheer#
 

  bron("park_functies.R")
  
  output$plot1 <- renderPlot({
    plot.radar(input$slider)
   
  })
}

shinyApp(ui, server)
Parkinson dashboard met vergelijkingsgrafiek van geslacht en tijd.

Vervolgens upload je de app naar shiny server en viola! Het bespaart je 1000 plots en is echt leuk om te ontdekken!

Veel succes!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *


nl_NLDutch