Добавление меток данных из второго фрейма данных в ggplot, содержащий geom_path()

#r #ggplot2 #labeling

#r #ggplot2 #маркировка

Вопрос:

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

Время цикла с метками данных по мере необходимости Время цикла с метками данных по мере необходимости

Я могу сгенерировать график ниже (ниже приведен код), но не могу добавить метки данных на диаграмму.

Постройте график с помощью geom_path(), для которого требуются метки данных

Постройте график с помощью geom_path(), для которого требуются метки данных

Я строю это из следующего:

  1. df1: совокупная средняя продолжительность в неделю (geom_path() и geom_point() читают это)
 week variable value

23   Step 1   0.14

24   Step 1   0.21

23   Step 2   0.25

24   Step 2   0.35

23   Step 3   0.53

24   Step 3   0.65
 
  1. df2: средняя продолжительность в неделю (метки данных берутся из этого)
 week variable value

23   Step 1   0.14

24   Step 1   0.21

23   Step 2   0.11

24   Step 2   0.14

23   Step 3   0.28

24   Step 3   0.30
 

Мой код ggplot:

 ggplot(df1, aes(x=value, y=week)) 
  geom_path(mapping=NULL, data=df1,stat="identity", lineend="butt") 
  geom_point(aes(colour=variable, size=0.5)) 
  labs(title="Average cycle time, by components by week",
       x="Number of days",
       y="Week in the year") 
  theme(axis.text=element_text(size=9),
        axis.title=element_text(size=12,face="bold")) 
  #annotate(geom="text",df2, aes(label=value)),
  #         hjust=1, vjust=-0.1)
 

Если я попробую строку аннотирования, я получу пустой график со следующей ошибкой:

 Error in is.finite(x) : default method not implemented for type 'list'
 

Я чувствую, что это может иметь какое-то отношение к тому, как я указал df1 и df2?

Есть мысли о том, как добавить эти метки данных?

Ответ №1:

Вместо использования annotate (у которого нет аргумента data, отсюда и ошибка) Я бы предложил использовать geom_text . Однако вместо использования обоих dfs мой предпочтительный подход заключался бы в объединении обоих наборов данных:

 library(ggplot2)
library(dplyr)

df1 <- read.table(text = "week variable value
23   Step_1   0.14
24   Step_1   0.21
23   Step_2   0.25
24   Step_2   0.35
23   Step_3   0.53
24   Step_3   0.65", header = TRUE)

df2 <- read.table(text = "week variable value
23   Step_1   0.14
24   Step_1   0.21
23   Step_2   0.11
24   Step_2   0.14
23   Step_3   0.28
24   Step_3   0.30", header = TRUE)

df3 <- df1 %>% 
  left_join(df2, by = c("week", "variable"), suffix = c("", "_lab"))
  
ggplot(df3, aes(x=value, y=week)) 
  geom_path(mapping=NULL, data=df1,stat="identity", lineend="butt") 
  geom_point(aes(colour=variable, size=0.5)) 
  labs(title="Average cycle time, by components by week",
       x="Number of days",
       y="Week in the year") 
  theme(axis.text=element_text(size=9),
        axis.title=element_text(size=12,face="bold")) 
  geom_text(aes(label=value_lab),
           hjust=1, vjust=-0.1)
 

На всякий случай. Если вы хотите использовать оба dfs:

 ggplot(df1, aes(x=value, y=week)) 
  geom_path(mapping=NULL, data=df1,stat="identity", lineend="butt") 
  geom_point(aes(colour=variable, size=0.5)) 
  labs(title="Average cycle time, by components by week",
       x="Number of days",
       y="Week in the year") 
  theme(axis.text=element_text(size=9),
        axis.title=element_text(size=12,face="bold")) 
  geom_text(data = df2, aes(label=value),
           hjust=1, vjust=-0.1)
 

Ответ №2:

Ваш data.frame, и вы добавляете первый шаг:

 df = data.frame(week=c(23,24,23,24,23,24),
variable=rep(c("Step 1","Step 2","Step 3"),each=2),
value=c(0.14,0.21,0.11,0.14,0.28,0.30))

df$week = factor(df$week)

df = rbind(data.frame(week=unique(df$week),variable="Step 0",value=0),df)
 

То, что у вас есть во втором фрейме данных, верно. Вы также можете создать график, используя два фрейма данных. Ниже я использую функцию cumsum() для вычисления кумулятивного значения на лету.

Вы можете использовать geom_text() или annotate() , но когда ваши метки близки, вам нужно их отразить, поэтому я использовал ggrepel ниже:

 library(ggrepel)

ggplot(df,aes(x=cumsum(value),y=week))   
geom_line(aes(group=week),col="black")  
geom_point(aes(col=variable))  
geom_text_repel(data=subset(df,variable!="Step 0"),
aes(x=cumsum(value)-value/2,y=week,label=value,group=week))
theme_minimal()
 

введите описание изображения здесь