График плавания в R с «пустым» пространством между сложенными брусьями (ggplot)

#r #ggplot2

#r #ggplot2

Вопрос:

Описание проблемы

Я пытаюсь создать график плавания в R, используя ggplot. Однако я сталкиваюсь с проблемой, когда я хотел бы иметь «пустое» пространство между двумя сложенными столбцами графика: столбцы расположены рядом друг с другом.

Код и примеры данных

У меня есть следующие примерные данные:

 # Sample data
df <- read.table(text="patient start keytreat duration
                 sub-1    0   treat1  3
                 sub-1    8   treat2  2
                 sub-1    13  treat3  1.5
                 sub-2    0   treat1  4.5
                 sub-3    0   treat1  4
                 sub-3    4   treat2  8
                 sub-3    13.5  treat3  2", header=TRUE)

  

Когда я использую следующий код для генерации графика плавания, в итоге получается график плавания с 3 объектами. Субъект 2 получил только 1 лечение (treatment 1), поэтому это отображается правильно.

Однако субъект 1 получил 3 лечения: лечение 1 с момента времени 0 до момента времени 3, затем ничего с 3 по 8, затем лечение 2 с 8 по 10 и т.д…

Данные нанесены таким образом, что у пациентов 1 и 3 все процедуры выполняются последовательно, а не с «пустыми» интервалами между ними.

 # Plot: bars
bars <- map(unique(df$patient)
            , ~geom_bar(stat = "identity", position = "stack", width = 0.6,
                        , data = df %>% filter(patient == .x)))



# Create plot
ggplot(data = df, aes(x = patient,
                      y = duration,
                      fill = reorder(keytreat,-start)))   
  bars  
  guides(fill=guide_legend("ordering"))   
  coord_flip() 

  

Вопрос

Как мне включить пустые места между двумя непоследовательными обработками в этот график плавания?

Ответ №1:

Я не думаю, что geom_bar в данном случае это правильная геометрия. На самом деле он предназначен для отображения частот или количества, и вы не можете явно управлять их начальными или конечными координатами.

geom_segment вероятно, это то, что вы хотите:

 library(tidyverse)

# Sample data
df <- read.table(text="patient start keytreat duration
                 sub-1    0   treat1  3
                 sub-1    8   treat2  2
                 sub-1    13  treat3  1.5
                 sub-2    0   treat1  4.5
                 sub-3    0   treat1  4
                 sub-3    4   treat2  8
                 sub-3    13.5  treat3  2", header=TRUE)

# Add end of treatment
df_wrangled <- df %>%
  mutate(end = start   duration)

ggplot(df_wrangled)  
  geom_segment(
    aes(x = patient, xend = patient, y = start, yend = end, color = keytreat),
    size = 8
  )  
  coord_flip()
  

Создано 2019-03-29 пакетом reprex (версия 0.2.1)