2016-04-29 37 views
-1

如何製作如下圖所示的條形圖?如何用ggplot2製作這樣的條形圖

Fig.1

我試過,但只能得到這一個:

Fig.2

這裏是我的代碼:

ggplot(N.Balance, aes(x = factor(Period), y = value)) + 
geom_bar(stat = "identity", aes(group = Type, fill = variable), osition = "stack", width = 0.6) + 
facet_wrap(~ Type,ncol = 1) + 
coord_flip() + 
scale_fill_grey() + 
theme_bw(base_size = 30, base_family = "serif") + 
labs(y = expression(paste("kg", " ", "N", " ", ha^{-1}))) + 
theme(legend.key.height = unit(0.5, "in")) 

和下面的數據顯示:

structure(list(Period = c("2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W", "2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W", "2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W", "2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W", "2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W", "2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W", "2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W", "2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W", "2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W", "2007R", "2007/2008W", "2008R", "2008/2009W", 
"2009R", "2009/2010W"), 
variable = c("Denitrification", "Denitrification", "Denitrification", "Denitrification", 
"Denitrification", "Denitrification", "Runoff", "Runoff", "Runoff", "Runoff", "Runoff", 
"Runoff", "Leaching", "Leaching", "Leaching", "Leaching", "Leaching", "Leaching", "NH3Vol", 
"NH3Vol", "NH3Vol", "NH3Vol", "NH3Vol", "NH3Vol", "Harvest", 
"Harvest", "Harvest", "Harvest", "Harvest", "Harvest", "Fertilizer", 
"Fertilizer", "Fertilizer", "Fertilizer", "Fertilizer", "Fertilizer", 
"Fix", "Fix", "Fix", "Fix", "Fix", "Fix", "Irrigation", "Irrigation", 
"Irrigation", "Irrigation", "Irrigation", "Irrigation", "Seeds", 
"Seeds", "Seeds", "Seeds", "Seeds", "Seeds", "Deposition", "Deposition", 
"Deposition", "Deposition", "Deposition", "Deposition"), 
value = c(-89.4, -34.4, -61.5, -82.5, -87.2, -34.7, -21.8, -33.4, -2.65, -42.8, 
-19.2, -58.7, -8.22, -1.44, -9.76, -4.76, -4.97, -19, -71.6, 
-50.8, -97.1, -10.9, -60.6, -19.6, -187, -116, -167, -96, -177, 
-127, 300, 200, 300, 200, 300, 200, 45, 15, 45, 15, 45, 15, 12.5, 
0, 11.6, 0, 11.3, 0, 0.9, 3, 0.9, 3, 0.9, 3, 8.41, 13.74, 4.01, 
13.34, 16.31, 9.81), Type = c("O", "O", "O", "O", "O", "O", "O", 
"O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", 
"O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "I", "I", "I", 
"I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", 
"I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I")), 
.Names = c("Period", "variable", "value", "Type"), class = "data.frame", 
row.names = c(NA, -60L)) 

注意,「O」型是指「輸出」和「我」的意思是「輸入」

+1

獲得幫助和工作代碼的最佳方式是發佈最少的輸入數據,並在此處預期結果內聯(而不是外部鏈接)。 – Gopala

+0

爲什麼你想複製那個怪物? – hrbrmstr

+0

@hrbrmstr,我只想知道是否ggplot2可以處理那種圖片或不。 – Frank

回答

2

這本來是做dput()我問的評論更有幫助,但我取代了print()輸出,對於那些想要貢獻的人來說。

有(至少)兩種方式(比下面的方法)接近該圖表。這一個依賴於新興geom_,讓你有水平條W/O coord_flip() - 這意味着你可以用小秤玩:

library(ggplot2) 
library(ggstance) # devtools::install_github("lionel-/ggstance") 
library(dplyr) 

N.Balance <- read.csv("~/Data/so.csv", stringsAsFactors=FALSE) 
N.Balance$Period_f <- factor(N.Balance$Period) 
N.Balance$Type_f <- factor(N.Balance$Type, 
         levels=c("O", "I"), 
         labels=c("Output", "Input")) 

gg <- ggplot(N.Balance, aes(x=value, y=Period_f)) 
gg <- gg + geom_barh(stat = "identity", 
        aes(group = Type, fill = variable), 
        position = "stack", width = 0.6) 
gg <- gg + geom_text(data=data.frame(Period=unique(N.Balance$Period)), 
        aes(x=5, y=Period, label=Period), 
        color="white", hjust=0, size=3) 
gg <- gg + scale_x_continuous(expand=c(0,-0.001)) 
gg <- gg + scale_fill_grey(name="") 
gg <- gg + facet_wrap(~ Type_f, ncol=2, scales="free_x") 
gg <- gg + guides(fill=guide_legend(keywidth = 2, keyheight = 1)) 
gg <- gg + labs(y=NULL, x = expression(paste("kg", " ", "N", " ", ha^{-1}))) 
gg <- gg + theme_bw() 
gg <- gg + theme(legend.key.height = unit(0.5, "in")) 
gg <- gg + theme(panel.background=element_blank()) 
gg <- gg + theme(panel.border=element_blank()) 
gg <- gg + theme(panel.margin=margin(l=0, r=0)) 
gg <- gg + theme(legend.position="top") 
gg <- gg + theme(panel.grid=element_blank()) 
gg <- gg + theme(strip.background=element_blank()) 
gg <- gg + theme(axis.text.y=element_blank()) 
gg <- gg + theme(axis.ticks.y=element_blank()) 
gg <- gg + theme(legend.key=element_blank()) 
gg <- gg + theme(legend.text=element_text(size=8)) 
gg <- gg + theme() 
gg 

enter image description here

這個新geom_barh()是在一個包,是不是在CRAN(尚未),所以如果這是一個問題,至少有其他兩種方式,正如我所說的。

另一種方式爲您提供了完全沖洗的條形,並且可以做到這一點,只需要geom_bar(),但它需要一些數據爭用和軸文本標籤的爭奪。您必須手工製作哪些刻面標籤可以在這裏免費獲得(如果您需要輸入/輸出標籤)。

如果你需要分開的傳說(和一些額外的調整來獲得酒吧刷新),那麼最直接的方法是做出兩個獨立的情節,編輯grob頁邊距&使用grid.arrange()。如果您在繪圖標題中使用此方法,還可以獲得對齊的輸入/輸出標籤。

這兩個都是「工作」。

如果您需要花樣填充,其他人將不得不幫助您。這是可行但乏味的。

+0

太棒了!感謝您花時間回覆我的問題。新的geom_barh()似乎很棒。 – Frank

+0

@ hrbrmstr,另一個基本問題:我對'aes(group =)'中的參數'group'有點困惑。如果ggplot由不同的組處理'geom_',爲什麼在這種情況下geom_bar(stat =「identity」,aes(group = Type,fill = variable))沒有提供預期的輸出?爲我的英語道歉。希望你能明白我在問什麼。 – Frank

+0

它與ggplot2如何處理(或者在這種情況下不處理)+和 - 與'position =「stack」'有關。它只是定義了> = 0的值,並且不會自動執行所需的交替佈置(我認爲這會回答您的問題,但我可能會誤解)。 – hrbrmstr