2014-06-09 228 views
0

我想繪製一些數據,然後爲平均值和平均值+/-標準偏差添加回歸線和水平線,每條線的顏色均不相同。我設法做到了這一點,但我無法得到正確的傳說。它顯示了前兩個標籤,但沒有提到三條水平線。我怎樣才能讓傳奇也爲這三條線的每一條都有一個標籤?ggplot缺少圖例中的標籤

提到的另一篇文章show_guide = TRUE,但這並不適合我。我也一直在尋找scale_colour_manual的文檔,但這並沒有幫助我。

我的代碼是這樣的:

p <- qplot(mpg, wt, data = mtcars, colour="1") 
p <- p + geom_smooth(method='lm',aes(x=mpg,y=wt,colour="2"),formula=y~x) 
p <- p + geom_hline(yintercept = mean(mtcars$wt), colour = "3") 
p <- p + geom_hline(yintercept = mean(mtcars$wt) + sd(mtcars$wt), colour = "3", linetype="dashed") 
p <- p + geom_hline(yintercept = mean(mtcars$wt) - sd(mtcars$wt), colour = "3", linetype="dashed")  
p <- p + labs(colour="")  
p <- p + scale_colour_manual(values = c("red","blue", "green","green","green"),labels=c("Data","Regression","Mean","Mean + SD","Mean - SD")) 
p <- p + guides(colour = guide_legend()) 
print(p) 

任何幫助將非常感激, 乾杯!

回答

2

我覺得這可能是更接近你想要什麼:

d <- data.frame(yint = c(mean(mtcars$wt) - sd(mtcars$wt), 
       mean(mtcars$wt), 
       mean(mtcars$wt) + sd(mtcars$wt)), 
       grp = c('dashed','solid','dashed')) 

p <- ggplot(data = mtcars,aes(mpg, wt)) + 
    geom_point(aes(color = "Data")) + 
    geom_smooth(method='lm',aes(x=mpg,y=wt,color = "Regression"),formula=y~x) + 
    geom_hline(data = d,aes(yintercept = yint,linetype = grp,color = "Mean +/- SD")) + 
    scale_linetype_manual(values = c('dashed' = 'dashed','solid' = 'solid')) + 
    labs(color = "") 
print(p) 

至於關於標註每個單獨的水平線的問題,我的回答是不會在傳說中屬於所有。這些應標有geom_text()

d <- data.frame(yint = c(mean(mtcars$wt) - sd(mtcars$wt), 
         mean(mtcars$wt), 
         mean(mtcars$wt) + sd(mtcars$wt)), 
         grp = c('dashed','solid','dashed'), 
         lab = c('-SD','Mean','+SD')) 

p <- ggplot(data = mtcars,aes(mpg, wt)) + 
    geom_point(aes(color = "Data")) + 
    geom_smooth(method='lm',aes(x=mpg,y=wt,color = "Regression"),formula=y~x) + 
    geom_hline(data = d,aes(yintercept = yint,linetype = grp),color = "green") + 
    geom_text(data = d,aes(y = yint,label = lab), 
       vjust = -0.5,hjust = 1,x = Inf,size = 3) + 
    scale_linetype_manual(values = c('dashed' = 'dashed','solid' = 'solid')) + 
    labs(color = "") 
print(p) 
+0

我恐怕不是。使用您的代碼,原始數據不會被繪製,圖例只會顯示兩個標籤。除了迴歸線和平均值和平均值±SD線之外,原始數據在圖例中被繪製和標記是絕對必要的。 – ermutarra

+0

@ermutarra看到我的編輯(我認爲這是微不足道的變化,但我猜不是)。我試圖引導你走向更好的ggplot實踐。請注意,您永遠不應該直接引用像'aes()'內'mtcars [,n + 1]'的列。這是一種非常糟糕的做法,如果你堅持這樣做,那麼非標準的評估將會最終扼殺你。此外,無論何時您添加同一個geom的多個副本,這都是一個肯定的跡象,表明您做錯了什麼。 ggplot不是爲了這樣使用而設計的。 (只是要清楚,我沒有投票。) – joran

+0

這更接近我所需要的,謝謝!但我仍然懷疑你是否可以在傳奇中展示五行。感謝您指出我的做法是不好的做法,我只是開始並且需要學習這些東西! – ermutarra

-1

Joran的回答促使我做出一些改變,現在我已成功地編寫一些代碼,讓我的情節和傳說我一直在尋找:

n <- ncol(mtcars) 
mtcars[,n+1] <- mean(mtcars$wt) 
mtcars[,n+2] <- mean(mtcars$wt) + sd(mtcars$wt) 
mtcars[,n+3] <- mean(mtcars$wt) - sd(mtcars$wt) 
p <- qplot(mpg,wt,data = mtcars, colour="1") 
p <- p + geom_smooth(method='lm',aes(x=mpg,y=wt,colour="2"),formula=y~x) 
p <- p + geom_line(aes(x=mpg,y=mtcars[,n+1],colour="3")) 
p <- p + geom_line(aes(x=mpg,y=mtcars[,n+2],colour="4"),linetype="dashed") 
p <- p + geom_line(aes(x=mpg,y=mtcars[,n+3],colour="5"),linetype="dashed") 
p <- p + labs(colour="")  
p <- p + scale_colour_manual(values = c("red","blue", "green","green","green"),labels=c("Data","Regression","Mean","Mean + SD","Mean - SD")) 
p <- p + guides(colour = guide_legend()) 
print(p)