Как получить идеальный график «до и после» с соединенными точками и парным U-тестом с помощью ggplot2? - PullRequest
1 голос
/ 06 мая 2020

Мои данные выглядят так:

mydata <- data.frame(ID = c(1, 2, 3, 5, 6, 7, 9, 11, 12, 13),          #patient ID
                    t1 = c(37, 66, 28, 60, 44, 24, 47, 44, 33, 47),    #evaluation before
                    t4 = c(33, 45, 27, 39, 24, 29, 24, 37, 27, 42),    #evaluation after
                    sexe = c(1, 2, 2, 1, 1, 1, 2, 2, 2, 1))            #subset

Я хотел бы сделать простой график до и после.

Пока мне удалось получить это: ugly before-after plot

Здесь:

library(ggplot2)
ggplot(mydata) + 
  geom_segment(aes(x = 1, xend = 2, y = t1, yend = t4), size=0.6) +
  scale_x_discrete(name = "Intervention", breaks = c("1", "2"), labels = c("T1", "T4"), limits = c(1, 2)) +
  scale_y_continuous(name = "Var") + theme_bw()

У меня несколько проблем, не могли бы вы помочь мне ...

  • добавить черный кружок в начало и конец каждой строки? (geom_point() не работает)
  • сделать линию более гладкой (посмотрите, насколько они пикселизированы, особенно вторая)?
  • уменьшить пустое пространство слева и справа от графика?
  • добавить медиану для T1 и T4 (красным), связать эти точки, сравнить их с парным тестом Манна-Уитни и вывести значение p на график?

Я бы не хотел переформатируйте мою базу данных в длинный формат. У меня есть много других переменных и временных точек (здесь не показаны). Я читал другие сообщения (например, здесь ), но предоставленное решение выглядит настолько сложным для чего-то, что кажется простым (но я не могу этого сделать ...). Огромное спасибо за вашу помощь!

Я буду обновлять график вместе с прогрессом :)

РЕДАКТИРОВАТЬ

Я бы не хотел переформатировать свою базу данных. длинный формат, так как у меня есть много других переменных и точек времени (здесь не показаны) ...

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Вот что бы я сделал! Пожалуйста, не стесняйтесь задавать вопросы о том, что здесь происходит.

library(tidyverse)

mydata <- data.frame(ID = c(1, 2, 3, 5, 6, 7, 9, 11, 12, 13),          #patient ID
                     t1 = c(37, 66, 28, 60, 44, 24, 47, 44, 33, 47),    #evaluation before
                     t4 = c(33, 45, 27, 39, 24, 29, 24, 37, 27, 42),    #evaluation after
                     sexe = c(1, 2, 2, 1, 1, 1, 2, 2, 2, 1))      

pval <- wilcox.test(x = mydata$t1,y = mydata$t4, paired = T,exact = F)$p.value %>% round(2)

df <- mydata %>% 
  pivot_longer(2:3,names_to = "Time") %>% # Pivot into long-format
  mutate(sexe = as.factor(sexe),
         Time = as.factor(Time)) # Make factors 

ggplot(df,aes(Time,value,color = sexe,group = ID)) + 
  geom_point() + 
  geom_line() + 
  stat_summary(inherit.aes = F,aes(Time,value),
    geom = "point", fun = "median", col = "red", 
    size = 3, shape = 24,fill = "red"
  ) +
  annotate("text", x = 1.7, y = 60, label = paste('P-Value is',pval)) + 
  coord_cartesian(xlim = c(1.4,1.6)) +
  theme_bw()

Также имейте в виду, что в дополнение к данным в длинном формате часто встречаются повторяющиеся во времени переменные. См. Пример здесь:

mydata <- data.frame(ID = c(1, 2, 3, 5, 6, 7, 9, 11, 12, 13),          #patient ID
                     t1 = c(37, 66, 28, 60, 44, 24, 47, 44, 33, 47),    #evaluation before
                     t4 = c(33, 45, 27, 39, 24, 29, 24, 37, 27, 42),    #evaluation after
                     sexe = c(1, 2, 2, 1, 1, 1, 2, 2, 2, 1),
                     var1 = c(1:10),
                     var2 = c(1:10),
                     var3 = c(1:10))


df <- mydata %>% 
  pivot_longer(2:3,names_to = "Time") %>% # Pivot into long-format
  mutate(sexe = as.factor(sexe),
         Time = as.factor(Time))

enter image description here

0 голосов
/ 06 мая 2020

Я могу решить (1) проблему с черными кругами:

Во-первых, вы должны привести данные в порядок, чтобы один столбец содержал информацию об одной переменной (теперь значения 'Var' на графике хранятся в двух столбцах: «t1» и «t4»). Вы можете добиться этого с помощью пакета tidyr.

library(tidyr)
mydata_long <- pivot_longer(mydata, c(t1, t4), names_to = "t")

Теперь создавать точки легко, а остальная часть кода становится намного понятнее: мы можем сказать ggplot, что мы хотим, чтобы группы 't' были включены ось x, их значения по оси y, а в случае линий мы хотим, чтобы они были разделены для каждого идентификатора.

ggplot(mydata_long) +
  geom_line(aes(x = t, y = value, group = ID)) + #ploting lines
  geom_point(aes(x = t, y = value)) + #ploting points
  labs(x = "Intervention", y = "Var") + #changing labels
  theme_bw()

Result plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...