2013-06-21 22 views
5

我有4個部門(A,B,C,D)和5年的數據。我想繪製4條線,每個扇區1條,每年添加一個點,並使用stat_summary語句添加代表平均線的第五條線,並通過scale_color_manualaes()參數控制線條顏色。問題是,如果我添加點幾何,圖例分爲兩部分,一部分用於點形狀,另一部分用於線條顏色。我不明白如何獲得1個結合顏色和點的圖例。當我使用stat_summary與行和點geoms我得到一個雙重的傳說

這裏是一個例子。首先,讓我們來構建數據幀dtfr如下:

a <- 100; b <- 100; c <- 100; d <- 100 
for(k in 2:5){ 
    a[k] <- a[k-1]*(1+rnorm(1)/100) 
    b[k] <- b[k-1]*(1+rnorm(1)/100) 
    c[k] <- c[k-1]*(1+rnorm(1)/100) 
    d[k] <- d[k-1]*(1+rnorm(1)/100) 
} 
v <- numeric() 
for(k in 1:5){ v <- c(v,a[k],b[k],c[k],d[k]) } 

dtfr <- data.frame(Year=rep(2008:2012,1, each=4), 
        Sector=rep(c("A","B","C","D"),5), 
        Value=v, 
        stringsAsFactors=F) 

現在讓我們開始通過ggpolt2繪製我們的圖形。在第一張圖我們繪製線條和點,而平均線GEOM:

library(ggplot2) 
ggplot(dtfr, aes(x=Year, y=Value)) + 
    geom_line(aes(group=Sector, color=Sector)) + 
    geom_point(aes(color=Sector, shape=Sector)) + 
    # stat_summary(aes(colour="mean",group=1), fun.y=mean, geom="line", size=1.1) + 
    scale_color_manual(values=c("#004E00", "#33FF00", "#FF9966", "#3399FF", "#FF004C")) + 
    ggtitle("Test for ggplot2 graph") 

在這個圖中,我們有線條顏色,並點了傳說塑造盡在其中:

enter image description here

但如果我用的是stat_summary使用下面的代碼繪製平均線:

ggplot(dtfr, aes(x=Year, y=Value)) + 
    geom_line(aes(group=Sector, color=Sector)) + 
    geom_point(aes(color=Sector, shape=Sector)) + 
    stat_summary(aes(colour="mean",group=1), fun.y=mean, geom="line", size=1.1) + 
    scale_color_manual(values=c("#004E00", "#33FF00", "#FF9966", "#3399FF", "#FF004C")) + 
    ggtitle("Test for ggplot2 graph") 

我得到的平均值(紅)線,但傳說是分爲兩部分,一部分用於線條顏色,另一部分用於點形狀。在這一點上,我的問題是:我怎樣才能得到像第一個圖形中的圖例的平均線圖?也就是說,如何在第二個圖形中只繪製一條線條和形狀的圖例,並在其中畫出平均線?

回答

9

試試這個:

ggplot(dtfr, aes(x=Year, y=Value)) + 
    geom_line(aes(group=Sector, color=Sector)) + 
    geom_point(aes(color=Sector, shape=Sector)) + 
    stat_summary(aes(colour="mean",shape="mean",group=1), fun.y=mean, geom="line", size=1.1) + 
    scale_color_manual(values=c("#004E00", "#33FF00", "#FF9966", "#3399FF", "#FF004C")) + 
    scale_shape_manual(values=c(1:4, 32)) + 
    ggtitle("Test for ggplot2 graph") 

ggplot2 example with a combined legend

也許有人更瞭解可以進來並糾正我的解釋(或提供更好的解決方案),但這裏是我如何理解它:你有5個值色階,但在形狀尺度上只有4個;你錯過了「平均」的價值。所以這些秤在某種程度上並不真正兼容。你可以通過給你的平均線分配一個空白形狀(32)來解決這個問題。

+1

+1好的解決方案,很好的解釋 – alexwhan

+0

謝謝非常適合你的良好工作的例子。現在我明白我的錯誤在哪裏了。 – user2509571

0

這是一種預先計算彙總/平均值的方法,並在構建圖之前將其作爲附加級別添加到數據框中。

該方法可以用來方便地添加額外的線條,但是使用特定的顏色,例如對於總結/平均值可能是需要的。

首先,我計算平均值並將其添加到OP的dtfr

dtfr2 <- dtfr %>% 
    dplyr::group_by(Year) %>% 
    dplyr::summarise(Value = mean(Value)) %>% 
    dplyr::mutate(Sector = NA) %>% 
    dplyr::bind_rows(dtfr) 

dtfr2現在有存儲在ValueNA S IN Sector平均值其他行。

然後,構建情節很簡單:

p1 <- ggplot(dtfr2, aes(x=Year, y=Value, color = Sector, shape = Sector)) + 
    geom_line() + 
    geom_point() 

最後,你可以調整傳說一點:

p1 + 
    scale_color_discrete(labels = c(letters[1:4], "M"), na.value = "black") + 
    scale_shape_discrete(labels = c(letters[1:4], "M")) 

ggplot with additional geom_line with specific color

相關問題