2016-04-29 21 views
-1

Wie erstellt man ein Balkendiagramm wie das folgende Bild?So erstellen Sie ein Balkendiagramm mit ggplot2

Fig.1

Ich habe versucht, aber kann dies nur bekommen ein:

Fig.2

Hier ist mein Code:

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")) 

und die Daten werden unten dargestellt:

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)) 
Hinweis

, dass der Typ „O“ bedeutet „Output“ und „I“ bedeutet „Input“

+1

Der beste Weg, um Hilfe und Arbeitscode zu erhalten, ist die Eingabe von minimalen Eingabedaten und erwartetem Ergebnis hier inline (anstelle von externen Links). – Gopala

+0

Warum möchten Sie diese Monstrosität replizieren? – hrbrmstr

+0

@hrbrmstr, ich möchte nur wissen, ob ggplot2 mit dieser Art von Bild umgehen kann oder nicht. – Frank

Antwort

2

Es wäre hilfreich gewesen, die dput() ich im Kommentar gebeten, zu tun, aber ich ersetzen den print() Ausgang mit das für andere, die etwas beitragen möchten.

Es gibt (mindestens) zwei andere Möglichkeiten (als die unten), um dem Diagramm näher zu kommen. Dieses stützt sich auf einen neu entstehenden geom_, die Sie haben horizontale Balken lässt w/o coord_flip() - was bedeutet, dass Sie mit Facette Skalen spielen kann:

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

Diese neue geom_barh() ist in einem Paket, das nicht auf CRAN (noch), wenn das ein Problem ist, gibt es - wie gesagt - mindestens zwei andere Möglichkeiten.

Ein anderer Weg gibt Ihnen völlig bündig Bars, und es ist möglich, dass w/nur geom_bar(), aber es dauert einige Daten Wrangling und Achse Text Label Streiten. Sie müssen Hand anlegen, welche Facetten-Beschriftung Sie hier kostenlos erhält (wenn Sie die Input/Output-Etiketten benötigen).

Wenn Sie die Legenden getrennt benötigen (und einige zusätzliche Optimierungen, um die Balken bündig zu machen), dann ist der einfachste Weg, zwei separate Plots zu erstellen, Grobränder zu bearbeiten & zu verwenden. Mit dieser Methode können Sie auch Eingabe-/Ausgabeetiketten ausrichten, wenn Sie dies im Diagrammtitel tun.

Beide sind "Arbeit".

Wenn Sie Musterfüllungen benötigen, muss jemand anderes Ihnen helfen. Das ist machbar, aber langweilig.

+0

Fantastisch! Danke, dass Sie sich die Zeit genommen haben, auf meine Frage zu antworten. Die neue 'geom_barh()' scheint großartig. – Frank

+0

@ hrbrmstr, Eine weitere grundlegende Frage: Ich bin etwas verwirrt über den Parameter 'group' in' aes (group =) '.Wenn ggplot den 'geom_' mit verschiedenen Gruppen behandelt, warum, in diesem Fall,' geom_bar (stat = "identity", aes (group = Typ, fill = variable)) 'gab nicht die erwartete Ausgabe? Entschuldige dich für mein Englisch. Ich hoffe du verstehst was ich verlange. – Frank

+0

ist es mehr damit zu tun, wie ggplot2 sowohl + als auch - mit dem 'position =" stack "' handhabt (oder in diesem Fall nicht handhabt). Es ist nur gut definiert für> = 0 Werte und wird nicht automatisch die alternierende Anordnung, die Sie benötigen (ich denke, das beantwortet Ihre Frage, aber ich könnte falsch verstanden haben). – hrbrmstr

Verwandte Themen