#r #ggplot2 #labeling
#r #ggplot2 #маркировка
Вопрос:
Я пытаюсь сравнить длительности различных компонентов в цикле в течение нескольких временных точек (недель). В идеале график должен выглядеть следующим образом:
Время цикла с метками данных по мере необходимости
Я могу сгенерировать график ниже (ниже приведен код), но не могу добавить метки данных на диаграмму.
Постройте график с помощью geom_path(), для которого требуются метки данных
Я строю это из следующего:
- 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
- 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()