2014-10-04 77 views
0

我對使用ggplot2在同一圖表中繪製點和線條有疑問。下面提供了用於產生模擬數據的代碼:在ggplot2中添加具有自定義圖例的點和線圖層

library(ggplot2) 
set.seed(111) 
x = seq(1,10,length=10) 
y1 = rnorm(10, 0, 0.1) 
y2 = rnorm(10, 5, 0.1) 
y3 = rnorm(10, 10, 0.3) 
y4 = rnorm(10, 20, 0.4) 
label = c(rep("Cat",10), rep("Dog", 10), rep("Owl", 10), rep("Eagle", 10)) 
dat1 = data.frame(cbind(x, y=y1)) 
dat2 = data.frame(cbind(x, y=y2)) 
dat3 = data.frame(cbind(x, y=y3)) 
dat4 = data.frame(cbind(x, y=y4)) 
dat = data.frame(rbind(dat1, dat2, dat3, dat4)) 
dat = cbind(dat, label) 
dat 

我使用以下代碼來生成的情節:

ggplot(dat, aes(x=x, y=y, colour=label)) + 

    geom_line(data=dat[dat$label=="Cat", ], aes(x=x, y=y, linetype=label)) + 
    geom_line(data=dat[dat$label=="Dog", ], aes(x=x, y=y, linetype=label)) + 

    geom_point(data=dat[dat$label=="Owl", ], aes(x=x, y=y, colour=label)) + 
    geom_point(data=dat[dat$label=="Eagle", ], aes(x=x, y=y, colour=label)) + 

    scale_color_manual("Animal", 
        values = c("Cat" = "darkgreen", 
           "Dog" = "blue", 
           "Owl" = "red", 
           "Eagle" = "cyan")) + 
    theme_bw() + 
    scale_linetype_manual(values=c(1,2)) + 
    scale_alpha_manual(values=c(0.8, 0.8, 0.2, 0.2)) + 
    scale_size_manual(values=c(1.8, 1.8, 0.6, 0.6)) + 
    theme(legend.key=element_blank(), 
     legend.key.width = unit(3, "line"), 
     legend.key = element_blank()) 

電流積輸出看起來像這樣: enter image description here

的以下幾點需要更改以獲得我想要的圖:

  1. 刪除「標籤」圖例,只顯示「動物」圖例
  2. 「Cat」和「Dog」圖例只顯示點,而不顯示線;對於「貓頭鷹」和 「鷹」的傳說,只顯示線條,沒有點
  3. 傳說線路類型應該匹配在情節
  4. 傳說應該是相同的順序,因爲我指定標籤的順序:貓,狗,貓頭鷹和鷹
  5. 我希望線是ticker(例如寬度= 2),並且點更透明(例如alpha = 0.4)
  6. 傳說位置是在圖,不在外面

    我感謝您的幫助/建議。謝謝!

回答

1

當您使用不同的顏色和線型然後拿到傳說中,你需要爲了最簡單的方法是使用功能factor()改變級別的順序在你原來的數據幀。

dat$label<-factor(dat$label,levels=c("Cat","Dog","Owl","Eagle")) 

的情節我只用一個呼籲geom_point()geom_line()並設置colour=linetype=shape=labelggplot()aes()內。然後使用scale_color_manual()設置您需要的顏色,然後用scale_linetype_manual()爲Cat和Dog設置線型1和2,爲其他兩個級別設置0(不可見線)。在scale_shape_manual()裏面爲Cat和Dog設置值爲NA。在所有手動磅秤中使用相同的名稱只能獲得一個圖例。 Alpha和尺寸在geom_point()geom_line()內更改。圖例位置被調整爲函數theme()的參數legend.postion=

ggplot(dat, aes(x=x, y=y, colour=label,linetype=label,shape=label)) + 
     geom_point(alpha=0.4)+ 
     geom_line(size=2)+ 
     scale_color_manual("Animal", 
         values = c("Cat" = "darkgreen", 
            "Dog" = "blue", 
            "Owl" = "red", 
            "Eagle" = "cyan")) + 
     scale_linetype_manual("Animal",values=c(1,2,0,0)) + 
     scale_shape_manual("Animal",values=c(NA,NA,16,16))+ 
     theme_bw()+ 
     theme(legend.position=c(0.85,0.80)) 

enter image description here

+0

非常感謝!這正是我想要的:) – alittleboy 2014-10-05 15:35:34

+0

對不起,我還有一個問題:有沒有辦法隱藏「鷹」的傳說?我只想顯示其他三個變量的傳說,但在圖中,應該顯示所有四個變量。謝謝! – alittleboy 2014-10-05 19:28:21

+1

爲所有三個'scale _...'函數添加參數'breaks = c(「Cat」,「Dog」,「Owl」)' – 2014-10-06 04:43:33