R/ggplot2 - Перекрывающиеся метки на facet_grid

Близкие,

Я строю гистограммы, используя 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)

Это не помогло. Фактически, он выдал предупреждение о ширине.

Не могли бы вы помочь? Спасибо, Риад.


person Riad    schedule 03.12.2013    source источник


Ответы (2)


Я думаю, вы могли бы предварительно рассчитать средние значения перед построением в новом фрейме данных.

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))

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

person Didzis Elferts    schedule 03.12.2013
comment
Большое спасибо за быстрый ответ. Это именно то, что я ищу! Риад. - person Riad; 04.12.2013

Просто чтобы расширить @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.

person jlhoward    schedule 03.12.2013
comment
Отличное объяснение, теперь я понимаю, почему я получал одно и то же число во всех аспектах. Кстати, я выбрал базовое решение plyr, так как мне нужно было рассчитать квантили: df.text<-ddply(df,.(type,subtype),summarise,mean=mean(value),sd=sd(value),Q0027=quantile(value,0.0027,names=F)) . Спасибо еще раз за ваши комментарии, очень признателен - person Riad; 04.12.2013