R中的游泳者图表(ggplot):如何订购堆叠的条形图?

时间:2018-12-03 10:52:17

标签: r ggplot2

我有一个问题,涉及在R中使用GGplot在游泳者图中的堆叠棒的排序。

我有一个(人工)接受治疗的患者的样本数据集。

library(tidyverse)

df <- read.table(text="patient start_t_1 t_1_duration start_t_2 t_2_duration start_t_3 t_3_duration start_t_4 t_4_duration end
                 1    0    1.5    1.5   3   NA    NA    4.5    10   10
                 2    0    2    4.5    2    NA    NA    2   2.5   10
                 3    0    5    5   2   7   0.5   7.5   2   9.5
                 4    0    8    NA    NA    NA    NA    8   2   10", header=TRUE)

所有患者在时间= 0时开始第一次治疗。随后,患者获得不同的治疗(编号t_2至t_4)。

我尝试使用以下代码绘制游泳者图:

df %>% 
  gather(variable, value, c(t_1_duration, t_2_duration, t_3_duration, t_4_duration)) %>% 
  ggplot(aes(x = patient, y = value, fill = variable)) + 
  geom_bar(stat = "identity") +
  coord_flip()

但是,治疗未按正确的顺序显示。 例如:患者3连续接受所有治疗,而患者2首先接受治疗1,然后接受4和最后接受2。 因此,简单地颠倒顺序是行不通的。

如何按时间顺序排列堆叠的条形?

1 个答案:

答案 0 :(得分:2)

那呢:

df %>% 
  gather(variable, value, c(t_1_duration, t_2_duration, t_3_duration,t_4_duration)) %>% 
  ggplot(aes(x = patient,
             y = value,
             # here you can specify the order of the variable
             fill = factor(variable, 
                          levels =c("t_4_duration", "t_3_duration", "t_2_duration","t_1_duration")))) + 
  geom_bar(stat = "identity") +
  coord_flip()+ guides(fill=guide_legend("My title")) 

enter image description here

编辑:  这很漫长,因为它涉及到kind of hack。我认为这不是对这个问题的重复,因为它还涉及到一些数据重塑:

library(reshape2)

# divide starts and duration
starts <- df %>% select(patient, start_t_1, start_t_2, start_t_3, start_t_4) 
duration <- df %>% select(patient, t_1_duration,t_2_duration, t_3_duration, t_4_duration)

# here you melt them
starts <- melt(starts, id = 'patient')  %>%
  mutate(keytreat = substr(variable,nchar(as.vector(variable))-2, nchar(as.vector(variable)))) %>%
  `colnames<-`(c("patient", "variable", "start","keytreat")) %>% select(-variable)
duration <- melt(duration, id = 'patient')  %>% mutate(keytreat = substr(variable,1, 3)) %>%
  `colnames<-`(c("patient", "variable", "duration","keytreat")) %>% select(-variable)

# join
dats <- starts %>% left_join(duration) %>% arrange(patient, start) %>% filter(!is.na(start))


# here the part for the plot
bars <- map(unique(dats$patient)
            , ~geom_bar(stat = "identity", position = "stack"
                        , data = dats %>% filter(patient == .x)))

dats %>% 
  ggplot(aes(x = patient,
             y = duration,
             fill = reorder(keytreat,-start))) + 
  bars +
  guides(fill=guide_legend("ordering"))  + coord_flip()

enter image description here

相关问题