Близкие,
Я строю гистограммы, используя geom_histogram, и я хотел бы пометить каждую гистограмму средним значением (я использую среднее значение для этого примера). Проблема в том, что я рисую несколько гистограмм в одном аспекте, и у меня перекрываются метки. Вот пример:
library(ggplot2)
df <- data.frame (type=rep(1:2, each=1000), subtype=rep(c("a","b"), each=500), value=rnorm(4000, 0,1))
plt <- ggplot(df, aes(x=value, fill=subtype)) + geom_histogram(position="identity", alpha=0.4)
plt <- plt + facet_grid(. ~ type)
plt + geom_text(aes(label = paste("mean=", mean(value)), colour=subtype, x=-Inf, y=Inf), data = df, size = 4, hjust=-0.1, vjust=2)
Результат:

Проблема в том, что метки для подтипов a и b перекрываются. Я хотел бы решить это.
Я пробовал позицию, как уклонение, так и стек, например:
plt + geom_text(aes(label = paste("mean=", mean(value)), colour=subtype, x=-Inf, y=Inf), position="stack", data = df, size = 4, hjust=-0.1, vjust=2)
Это не помогло. Фактически, он выдал предупреждение о ширине.
Не могли бы вы помочь? Спасибо, Риад.
Ответ 1 · рейтинг 4 · Didzis Elferts
Я думаю, вы могли бы предварительно рассчитать средние значения перед построением в новом фрейме данных.
library(plyr)
df.text<-ddply(df,.(type,subtype),summarise,mean.value=mean(value))
df.text
type subtype mean.value
1 1 a -0.003138127
2 1 b 0.023252169
3 2 a 0.030831337
4 2 b -0.059001888
Затем используйте этот новый фрейм данных в geom_text(). Чтобы гарантировать, что значения не перекрываются, вы можете указать два значения в vjust= (поскольку в каждом аспекте есть два значения).
ggplot(df, aes(x=value, fill=subtype)) +
geom_histogram(position="identity", alpha=0.4)+
facet_grid(. ~ type)+
geom_text(data=df.text,aes(label=paste("mean=",mean.value),
colour=subtype,x=-Inf,y=Inf), size = 4, hjust=-0.1, vjust=c(2,4))
Ответ 2 · рейтинг 2 · jlhoward
Просто чтобы расширить @Didzis:
На самом деле у вас есть две проблемы. Во-первых, текст перекрывается, но что более важно, когда вы используете функции агрегирования в aes(...), например:
geom_text(aes(label = paste("mean=", mean(value)), ...
ggplot не учитывает подмножество, подразумеваемое в фасетах (или в группах, если уж на то пошло). Таким образом, mean(value) основан на полном наборе данных, независимо от фасетирования или группировки. В результате вам приходится использовать вспомогательную таблицу, как показывает @Didzis.
КСТАТИ:
df.text <- aggregate(df$value,by=list(type=df$type,subtype=df$subtype),mean)
получает средства и не требует plyr.