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

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

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

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

Постройте с 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?

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


person noorie589    schedule 26.11.2020    source источник


Ответы (2)


Вместо использования annotate (у которого нет аргумента данных, отсюда и ошибка) я бы предложил использовать 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)
person stefan    schedule 26.11.2020

Ваш 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()

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

person StupidWolf    schedule 26.11.2020