2016-04-29 20 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)) 

私がコメントにを求めたが、私はとprint()出力を置き換えdput()を行うことがより便利だっただろう

+1

ヘルプと作業コードを入手する最良の方法は、(外部リンクではなく)最小の入力データと期待される結果をここにインラインで掲載することです。 – Gopala

+0

なぜその怪物を複製したいのですか? – hrbrmstr

+0

@hrbrmstr、私はちょうどggplot2がその種の画像を扱うことができるかどうかを知りたがっています。 – Frank

答えて

2

をタイプ「O」は「出力」を意味し、「私は」「入力」を意味することを注意貢献したいと思うかもしれない他の人のために。

このグラフに近づくには、少なくとも2つの方法(下の方法より)があります(下の方法以外)。

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()はないパッケージである:あなたがファセットスケールで遊ぶことができることを意味 - この1を使用すると、水平バーW/O coord_flip()を持っていることができますそのgeom_新興新に依存していますCRANには(まだ)問題がある場合は、私が言ったように少なくとも2つの方法があります。

他の方法では、バーを完全にフラッシュすることができます。それにはgeom_bar()を使用することもできますが、データの巻き起こしと軸のテキストラベルの巻き返しが必要です。ファセットラベリングがあなたに無料で提供されていることをクラフトに伝える必要があります(入力/出力ラベルが必要な場合)。

凡例を分離する必要がある場合(そしてバーを一掃するためにいくつかの追加調整が必要な場合)、最も厳密な方法は2つの別々のプロットを作成し、grobマージンを編集することです。& grid.arrange()を使用します。この方法では、プロットタイトルで入力/出力ラベルを整列させることもできます。

どちらも「仕事」です。

パターン塗りが必要な場合は、他の人があなたに手を差し伸べる必要があります。それはやりやすいが退屈だ。

+0

素晴らしい!私の質問に答える時間をとってくれてありがとう。新しい 'geom_barh()'は素晴らしいようです。 – Frank

+0

@ hrbrmstrもう少し基本的な質問:私は 'aes(group =)'の 'group'パラメータについて少し混乱しています。gogplotが異なるグループで 'geom_'を扱う場合、' geom_bar(stat = "identity"、aes(group = Type、fill = variable)) 'が期待された出力を与えなかったのはなぜですか?私の英語を謝ります。あなたが私が求めていることを理解できるといいなあと思っています。 – Frank

+0

ggplot2が+と - の両方を 'position =" stack "'でどのように扱うか(またはこの場合は扱いません)と関係します。それは> = 0の値に対してのみ明確に定義されており、あなたが必要とする交互配置を自動的には行いません(これはあなたの質問に答えますが、私は誤解している可能性があります)。 – hrbrmstr

関連する問題