2013-12-03 96 views
0

民間,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

的問題是,對於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) 

這並沒有幫助。事實上,它發出了關於寬度的警告。

您想得到答案嗎? 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

2

只是爲了擴大@Didzis:

你實際上有兩個問題在這裏。首先,文字重疊,但更重要的是,當你在aes(...)使用聚集功能,如:

geom_text(aes(label = paste("mean=", mean(value)), ... 

ggplot不尊重的方面所隱含的子集(或組爲此事)。所以mean(value)基於完整的數據集,而不管分面或分組。因此,您需要使用輔助表,如@Didzis所示。

BTW:

df.text <- aggregate(df$value,by=list(type=df$type,subtype=df$subtype),mean) 

讓你的手段,並不需要plyr

+0

很好的解釋,我現在明白了爲什麼我在所有方面都得到相同的數字。順便說一句,我去爲我需要計算分位數的基礎解決方案:'df.text <-ddply(df,。(type,subtype),summary,mean = mean(value),sd = sd(value), Q0027 =分位數(值,0.0027,名稱= F))。 Thx再次爲您的意見,非常感謝 – Riad