2014-10-31 161 views
0

我知道已經有很多關於將R^2值添加到圖的條目,但我無法遵循代碼。我繪製了三個分類的散點圖。我爲每一個添加了一個線性迴歸線。我現在想爲每個添加r^2的值,但我無法弄清楚如何做到這一點。ggplot2和迴歸直線和R^2值

我的代碼:

veg <- read.csv("latandwtall2.csv", header=TRUE) 

library("ggplot2") 

a <- ggplot(veg, aes(x=avglat, y=wtfi, color=genus)) + geom_point(shape=19, size=4) 
b <- a + scale_colour_hue(l=50) + stat_smooth(method = "lm", formula = y ~ x, size = 1, se = FALSE) 
c <- b + labs(x="Latitude", y="Weight (g)") 
d <- c + theme_bw() 
e <- d + theme(panel.grid.minor=element_blank(), panel.grid.major=element_blank()) 

#changes size of text 
f <- e + theme(
    axis.title.x = element_text(color="black", vjust=-0.35, size=15, face="bold"), 
    axis.title.y = element_text(color="black" , vjust=0.35, size=15, face="bold") 
) 
g <- e+theme(legend.key=element_rect(fill='white')) 
g 

與如何添加R^2個值任何幫助將不勝感激。謝謝!

回答

0

我真的不能重現自己在做什麼,但你需要使用註釋()

東西可以工作(10號點puting的R2)是:

R2 = 0.4 
i = 10 
text = paste("R-squared = ", R2, sep="") 
g = g + annotate("text", x=avglat[i], y=wtfi[i], label=text, font="Calibri", colour="red", vjust = -2, hjust = 1) 

使用vjust和hjust將文本的位置調整到點(更改i),然後用計算出的rsquared填充變量R2。您可以選擇您喜歡的點或手動輸入x,y座標,這取決於您。這有幫助嗎?

PS。我增加了額外的參數(字體,顏色),以便您可以靈活地改變它們。

0

單獨構建模型,從那裏獲取R^2,並將其添加到圖中。我會給你一些虛擬代碼,但如果你給了我們一個樣本數據框架,它的質量會更好。

r2 = summary(lm(wtfi ~ avglat, data=veg))$r.squared 
#to piggyback on Romain's code... 
i=10 
g = g + annotate("text", x=avglat[i], y=wtfi[i], label=round(r2,2), font="Calibri", colour="red", vjust = -2, hjust = 1) 

我寫在這裏如果你建立與R平方值的數據幀就不需要硬編碼在R^2的值。

4

的樣子,你也許能夠通過將其包含爲對geom_text的調用來使(大部分)自動化註釋文本的定位。

這是一個玩具的例子。在geom_text中使用rsq數據幀來放置r平方標籤。在這種情況下,我將它設置爲將標籤放在最高x值之後,並且predict函數獲取y值。對於單個情節來說,可能工作太多了,但如果你這樣做了很多,你可以把它變成一個函數,這樣你就不必每次都重複設置代碼,也許可以添加一些更好的邏輯使標籤位置更加靈活:

library(reshape2) # For melt function 

# Fake data 
set.seed(12) 
x = runif(100, 0, 10) 
dat = data.frame(x, y1 = 2*x + 3 + rnorm(100, 0, 5), 
       y2 = 4*x + 20 + rnorm(100, 0, 10)) 
dat.m = melt(dat, id.var="x") 

# linear models 
my1 = lm(y1 ~ x, data=dat) 
my2 = lm(y2 ~ x, data=dat) 

# Data frame for adding r-squared values to plot 
rsq = data.frame(model=c("y1","y2"), 
       r2=c(summary(my1)$adj.r.squared, 
         summary(my2)$adj.r.squared), 
       x=max(dat$x), 
       y=c(predict(my1, newdata=data.frame(x=max(dat$x))), 
        predict(my2, newdata=data.frame(x=max(dat$x))))) 

ggplot() + 
    geom_point(data=dat.m, aes(x, value, colour=variable)) + 
    geom_smooth(data=dat.m, aes(x, value, colour=variable), 
       method="lm", se=FALSE) + 
    geom_text(data=rsq, aes(label=paste("r^2 == ", round(r2,2)), 
          x=1.05*x, y=y, colour=model, hjust=0.5), 
      size=4.5, parse=TRUE) 

enter image description here