2013-12-03 3 views
0

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

Результат:

This is the result I get

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

Я попытался позицию, как увернуться и стека, например:

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) 

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

Вы помогли бы? Thx, Riad.

ответ

4

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

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

enter image description here

+0

Большое вам спасибо за ваш быстрый ответ. Это именно то, что я ищу! Riad. – Riad

2

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

+0

Отличное объяснение, теперь я понимаю, почему я получал одинаковое число во всех аспектах. BTW, я пошел на базовое решение plyr, поскольку мне нужно было вычислить квантили: 'df.text <-ddply (df,. (Type, subtype), sumize, mean = mean (value), sd = sd (value), Q0027 = quantile (значение, 0.0027, names = F)). Thx снова для ваших комментариев, очень ценится – Riad

Смежные вопросы