
Радарные диаграммы все еще не так распространены, как их другие сестры и братья. Они позволяют показать различия между группами по многим переменным одновременно. Они хорошо работают, если у вас есть какой-то максимум для этих переменных. Кроме того, если у вас не так много групп для сравнения, в идеале 2-3. И если вас не интересуют сами распределения.
Тем не менее, они визуально привлекательны и могут быть приятной частью динамического приложения Shiny.
Ниже приведен простой код для построения радарного графика для данных о симптомах болезни Паркинсона. Каждый симптом оценивается в баллах от 0 до 100. Поскольку данные являются продольными, функция позволяет построить график в определенный момент времени. Также включено упорядочивание по степени тяжести.
Функция работает для бинарной группы.
Plot.Bin.Radar<-функция(timepoint,group,order_by_severity = FALSE){
1TP5Данные о симптомах протекания#
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,
депрессия=m.data$depression,withrawn=m.data$withdrawn,
тревога=m.data$anxiety,усталость=m.data$fatigue,
сонливость=m.data$sleepy,дискинезия=m.data$dyskinesia,
тремор=m.data$tremor,равновесие=m.data$balance,
головокружение=m.data$dizzy,зрительное=m.data$visual,бессонница=m.data$insomnia,
rbd=m.data$rbd,restlesslegs=m.data$restlesslegs,
мышечная боль=m.data$musclepain,речь=m.data$speech,
слюни=m.data$drool,сутулость=m.data$stoop,
память=m.data$memory,понимание=m.data$comprehension,запах=m.data$smell,
сексуальные=m.data$sexual,мочевые=m.data$urinary,
галлюцинации=m.data$hallucinations,тошнота=m.data$nausea,время=m.data$TimeCont)
#where групповая переменная в данных#
where.group<-which(names(m.data)==group)
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),]
all.symptoms.0 <- data.frame(sapply(data.symptoms.0, function(x) as.numeric(as.character(x))))
all.symptoms.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]))
1TP5Упорядочивание по степени тяжести#
if (order_by_severity) {
# Рассчитайте среднюю степень тяжести в обеих группах
mean_severity <- colMeans(data, na.rm = TRUE)
ordered_symptoms <- names(sort(mean_severity, decreasing = TRUE))
data <- data[, ordered_symptoms]
}
get.labels<-names.data$Field.Label[names.data$Variable.Field.Name==group]
rownames(data) <- c(paste0(" No ", timepoint, "m."),paste0(" Yes ",timepoint, "m."))
# Чтобы использовать пакет fmsb, я должен добавить 2 строки в кадр данных: максимальное и минимальное значение каждой переменной для отображения на графике!
data <- rbind(rep(100,33) , rep(0,33) , data)
# Цветной вектор (границы и заливка)#
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) )
График # с параметрами по умолчанию:
radarchart( data , axistype=1 ,
#custom polygon
pcol=colors_border , pfcol=colors_in , plwd=4 , plty=1,
1TP5Настроить сетку
cglcol="grey", cglty=1, axislabcol="grey", caxislabels=seq(0,20,5), cglwd=0.8, vlcex=0.8,title=get.labels)
legend(x=0.8, y=1.3, legend = 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("Симптомы упорядочены по средней тяжести во всех группах",
side = 1, line = 4, cex = 0.9, col = "grey40")
}
}
Plot.Bin.Radar(0, "gender",order_by_severity = TRUE)

В результате вызова функции Plot.Bin.Radar(0, "gender",order_by_severity = TRUE) мы имеем график, как показано выше. Для пола, для 0 месяцев (исходный уровень). Теперь представьте себе приложение Shiny со временем в качестве ползунка:
библиотека(shinydashboard)
ui <- dashboardPage(
dashboardHeader(title = "Дашборд Паркинсона"),
dashboardSidebar(),
dashboardBody(
# Боксы необходимо расположить в ряд (или колонку)
fluidRow(
box(width = 6,plotOutput("plot1", height = 450)),
box(
title = "Базовый уровень по сравнению с другой временной точкой",
sliderInput("slider", "Choose time point:", 0, 24, 6)
)
)
)
)
server <- function(input, output) {
библиотека(fmsb)
your.data <- read.csv("mydata.csv")
#Делайте некоторые операции с данными здесь#
source("park_functions.R")
output$plot1 <- renderPlot({
Plot.Radar(input$slider)
})
}
shinyApp(ui, server)

Затем загрузите приложение на блестящий сервер и альт! Это сэкономит вам около 1000 участков и будет действительно интересно исследовать!
Удачи!
