2014-08-30 112 views
2

我想通過使用小節來顯示某些時期的不同值,在ggplot2中設計出一個不錯的圖。我得到了圖形,但是我無法在圖表的正面添加圖例。我的數據幀DF有3個變量Month,variable,value。這些變量是melt()函數在另一個數據中的結果(我在最後部分添加dput()版本DF)。所以,我的數據幀DF看起來是這樣的:如何在ggplot2條形圖中添加圖例

Month variable  value 
1  m2 Power 1258978.9 
2  m3 Power 1608317.4 
3  m4 Power 1293821.1 
4  m5 Power 1819283.8 
5  m6 Power 1436552.9 
6  m7 Power 875170.3 
7  m8 Power 1315856.2 
8  m9 Power 710004.3 
9 m10 Power 889398.1 
10 m11 Power 1114883.1 
11 m12 Power 1419242.1 
12 m13 Power 1585857.2 
13 m14 Power 1010455.6 
14 m15 Power 1292333.4 

要顯示value變量由month演變我用這個代碼:

library(ggplot2) 
library(scales) 
ggplot(DF, aes(x = Month, y = value))+geom_bar(position="identity",fill="#FF6C91",colour="black",size=1)+ scale_y_continuous(labels = comma,breaks=pretty_breaks(n=7),limits=c(0,max(DF$value,na.rm=T)))+ 
    theme(axis.text.x=element_text(angle=90,colour="grey20",face="bold",size=12),axis.text.y=element_text(colour="grey20",face="bold",hjust=1,vjust=0.8,size=15),axis.title.x=element_text(colour="grey20",face="bold",size=16),axis.title.y=element_text(colour="grey20",face="bold",size=16))+xlab('Month')+ylab('')+ ggtitle("My graph")+theme(plot.title = element_text(lineheight=3, face="bold", color="black",size=24))+theme(legend.text=element_text(size=14),legend.title=element_text(size=14)) 

有了這個代碼,我得到了下一個圖形: enter image description here

結果幾乎是完美的,但我不知道如何在圖的右側添加具有相同顏色條的圖例,以便在此圖像中提供更多信息。我試圖在geom_bar裏添加fill參數,但是我無法得到我想要的結果。該dput()版本的DF是下一個:

DF=structure(list(Month = c("m2", "m3", "m4", "m5", "m6", "m7", 
"m8", "m9", "m10", "m11", "m12", "m13", "m14", "m15"), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Power", class = "factor"), 
    value = c(1258978.86, 1608317.42, 1293821.14, 1819283.78, 
    1436552.93, 875170.34, 1315856.24, 710004.35, 889398.08, 
    1114883.11, 1419242.11, 1585857.22, 1010455.56, 1292333.35 
    )), .Names = c("Month", "variable", "value"), row.names = c(NA, 
-14L), class = "data.frame") 

你的幫助非常感謝。

+1

你只有一種顏色吧爲什麼你需要一個傳奇?真正的DF有更多的'變量'水平? – 2014-08-30 17:18:35

+0

@ user1317221_G - 我將問題解釋爲意味着OP想要「使用」該空間來提供可能與數據本身不直接相關的輔助信息......但主要是以我的名義猜想。 – Chase 2014-08-30 17:30:31

+2

重複http://stackoverflow.com/questions/13353396/add-legend-to-geom-bar-using-the-ggplot2-package – 2014-08-30 17:30:56

回答

2

你只需要做出aes正題映射的填充部分:

gg <- ggplot(DF, aes(x=Month, y=value)) 
gg <- gg + geom_bar(stat="identity", aes(fill=variable), colour="black", size=1) 
gg <- gg + scale_y_continuous(labels=comma, breaks=pretty_breaks(n=7), 
           limits=c(0, max(DF$value,na.rm=T))) 
gg <- gg + scale_fill_manual(values="#FF6C91", name="Legend name") 
gg <- gg + labs(x="Month", y="", title="My graph") 
gg <- gg + theme(plot.title=element_text(lineheight=3, face="bold", color="black", size=24)) 
gg <- gg + theme(legend.text=element_text(size=14), legend.title=element_text(size=14)) 
gg <- gg + theme(axis.text.x=element_text(angle=90, colour="grey20", face="bold", size=12), 
       axis.text.y=element_text(colour="grey20", face="bold", hjust=1, vjust=0.8, size=15), 
       axis.title.x=element_text(colour="grey20", face="bold", size=16), 
       axis.title.y=element_text(colour="grey20", face="bold", size=16)) 
    gg 

enter image description here

注:我改變了position="identity"stat="identity"(我想既然你做你prbly只是誤貼得到它的工作),重新構造ggplot使修改變得更容易(程序員的偏好,而不是使它工作的必要),然後在將填充美學映射到變量之後進行手動縮放(並且您可以在那裏重命名圖例標題也如所示)。這是自動啓用圖例的映射。我還投入了一個theme_bw()呼籲,要求採取好的措施(並且覈實灰色背景)。

我會將x軸標籤旋轉回水平,但不希望強加這一點。讓人們傾斜頭部閱讀標籤通常不被推薦,但由於他們只是m和數字,它可能不會那麼難。

除非您需要將它們排列在x軸上(即按照現在的方式重要),否則可能需要對條進行排序(從低到高或反之亦然)。

0

您需要將fill映射到美學強制傳奇。從那裏,你可以添加任何你想要的其他信息與scale_fill_manual

下面的代碼(注意,我做了一個因素了一個月,這樣的x軸是爲了,或至少,我認爲你想要的順序排列):

DF$Month2 <- factor(DF$Month, levels = paste0("m", 2:15)) 

ggplot(DF, aes(x = Month2, y = value, fill = variable)) + 
    geom_bar(stat="identity",colour="black",size=1) + #NOTE - you need stat = identity, not position 
    scale_y_continuous(labels = comma,breaks=pretty_breaks(n=7), 
        limits=c(0,max(DF$value,na.rm=T))) + 
    theme(axis.text.x=element_text(angle=90,colour="grey20",face="bold",size=12), 
     axis.text.y=element_text(colour="grey20",face="bold",hjust=1,vjust=0.8,size=15), 
     axis.title.x=element_text(colour="grey20",face="bold",size=16), 
     axis.title.y=element_text(colour="grey20",face="bold",size=16)) + 
    xlab('Month')+ylab('')+ ggtitle("My graph") + 
    theme(plot.title = element_text(lineheight=3, face="bold", color="black",size=24)) + 
    theme(legend.text=element_text(size=14), 
     legend.title=element_text(size=14)) + 
    scale_fill_manual(name = "This is stuff I made up", 
        label = "This is stuff I made up II", 
        values = "#FF6C91") 

給你:

enter image description here

0

至於別人的說,你需要在aes指定的fill。這裏是另一個版本,與一對夫婦的更多選項,你要考慮(傳說中的名字和標籤和位置等):

ForLeg=c(Power="#FF6C91"); 
    ggplot(DF, aes(x = Month, y=value, fill=as.factor(variable)))+ 
     geom_bar(stat="Identity",colour="black",size=1)+ 
     scale_fill_manual(values=ForLeg, labels="The value")+ 
     scale_y_continuous(labels = comma,breaks=pretty_breaks(n=7),limits=c(0,max(DF$value,na.rm=T)))+ 
     theme(axis.text.x=element_text(angle=90,colour="grey20",face="bold",size=12),axis.text.y=element_text(colour="grey20",face="bold",hjust=1,vjust=0.8,size=15),axis.title.x=element_text(colour="grey20",face="bold",size=16),axis.title.y=element_text(colour="grey20",face="bold",size=16))+ 
     xlab('Month')+ 
     ylab('')+ 
     ggtitle("My graph")+ 
     theme(plot.title = element_text(lineheight=3, face="bold", color="black",size=24))+ 
     theme(legend.position="top",legend.text=element_text(size=14),legend.title=element_text(size=14))+ 
     guides(fill=guide_legend(title="",keywidth = 2, keyheight = 1,title.position = "left",title.hjust = -0.28)) 

有了這樣的圖形: enter image description here