2016-11-19 4 views
1

Code, wo Ich mag würde 2x2 Balkendiagramme Seite-an-Seite, so dass der Y-Achsen-Maximalwert wäre das gleiche in allen undR: Four-Latch-Barcharts Seite an Seite in 2x2-Fenster?

  • gemeinsamen ylabel
  • gemeinsamen xlabel
  • gemeinsame Legenden tun
  • gemeinsamer Titel
  • jedes Balkendiagramm mit ihren eigenen Untertiteln
  • Trennlinie zwischen jedem Balkendiagramm wie in Fig. 2

-Code

# Wanted output 2x2 barchart where top column Ite. 1 and Ite. 2 and row-names female and male 
# http://www.magesblog.com/2012/12/changing-colours-and-legends-in-lattice.html 

require("lattice") 

f<-function(x) as.double(as.character(x)) #factors converted to vectors http://stackoverflow.com/a/40680020/54964 

data.female <- structure(list(N11.1 = structure(c(3L, 3L), .Label = c("", "0.0", 
"1.0", "N11"), class = "factor"), N22.1 = structure(c(2L, 2L), .Label = c("", 
"0.0", "2.0", "N22"), class = "factor"), N33.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N33"), class = "factor"), N44.1 = structure(2:3, .Label = c("", 
"0.0", "0.1", "0.2", "N44"), class = "factor"), N21.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N21"), class = "factor"), N31.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N31"), class = "factor"), N32.1 = structure(c(5L, 
7L), .Label = c("", "0.0", "10.8", "11.0", "12.0", "17.0", "20.9", 
"22.8", "24.0", "3.0", "4.0", "44.0", "N32"), class = "factor")), .Names = c("N11.1", 
"N22.1", "N33.1", "N44.1", "N21.1", "N31.1", "N32.1"), row.names = c("Sinus", 
"Arr/AHB"), class = "data.frame") 

data.male <- structure(list(N11.1 = structure(c(3L, 3L), .Label = c("", "0.0", 
"1.0", "N11"), class = "factor"), N22.1 = structure(c(2L, 2L), .Label = c("", 
"0.0", "2.0", "N22"), class = "factor"), N33.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N33"), class = "factor"), N44.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "0.1", "0.2", "N44"), class = "factor"), 
    N21.1 = structure(c(2L, 2L), .Label = c("", "0.0", "N21"), class = "factor"), 
    N31.1 = structure(c(2L, 2L), .Label = c("", "0.0", "N31"), class = "factor"), 
    N32.1 = structure(c(11L, 9L), .Label = c("", "0.0", "10.8", 
    "11.0", "12.0", "17.0", "20.9", "22.8", "24.0", "3.0", "4.0", 
    "44.0", "N32"), class = "factor")), .Names = c("N11.1", "N22.1", 
"N33.1", "N44.1", "N21.1", "N31.1", "N32.1"), row.names = c("Sinus", 
"Arr/AHB"), class = "data.frame") 

ID<-c("Sinus","Arr/AHB") 

tl <- "female" 
barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.female, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 
tl <- "male" 
barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.male, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 

# Just repeat two barcharts more to get 2x2 example 
tl <- "female" 
barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.female, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 
tl <- "male" 
barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.male, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 

Fig. 1 Stromausgang trennen, Fig. 2 gesucht Ausgabestruktur, Fig. 3 Benutzer 20650 barchart Codeausgabe

enter image description here enter image description here enter image description here

R : 3.3.1
Betriebssystem: Debian 8.5

+0

facet_wrap() wird von Hilfe sein –

+1

Sie http überprüfen: // Stackoverflow.com/questions/34814478/ggplot2-multiple-plots-in-einer-Zeile-mit-einer-single-legende – akrun

+0

@akrun Wie wendet man 'facet_wrap (~ variable, scales =" free ")' hier? Ist "Schmelze" erforderlich? –

Antwort

1

Ich würde dies tun, indem Sie Ihre Daten Umformen

Erste aussortieren der Klasse der Variablen und

# convert type and add gender label 
# I would have a look at why your numerics have been stored as factors 
data.female[] <- lapply(data.female, function(x) as.numeric(as.character(x))) 
data.female$gender <- "female" 
data.female$ID <- rownames(data.female) 

data.male[] <- lapply(data.male, function(x) as.numeric(as.character(x))) 
data.male$gender <- "male" 
data.male$ID <- rownames(data.male) 

binden die beiden Datenrahmen zusammen Gruppenvariablen hinzufügen

dat <- rbind(data.female[names(data.male)], data.male) 

Vereinbaren Daten zum Plotten

library(reshape2) 
datm <- melt(dat) 

Grundstück

# Lattice 
library(lattice) 
barchart(variable ~ value|ID, groups=gender, data=datm, 
           auto.key=list(space='right')) 

# ggplot2 
ggplot(datm, aes(variable, value, fill=gender)) + 
    geom_bar(stat="identity", position = position_dodge()) + 
    facet_grid(ID ~ .) 
+0

Ja, einfach die Daten neu anordnen und Etiketten nach Bedarf hinzufügen. (Beachten Sie, dass der Grund, warum Ihre * gewünschte Ausgabe * 2x2 ist, ist, dass die Gruppierungsvariable (in Ihrer Frage die ID-Variable) vier Ebenen hat) – user20650

+1

Wenn Sie ein 2x2 benötigen, benötigen Sie entweder die Gruppierungsvariable, um mehr als zwei Ebenen zu haben, oder eine zusätzliche Variable zum Gruppieren. Dies verwendet die zweite, zB 'dat <- rbind (data.female [Namen (data.male)], data.female [Namen (data.male)], data.male, data.male); dat $ othergroupingvariable <- rep (c ("A", "B"), jeweils = 2); Datm <- Schmelze (dat, ID = c ("ID", "Geschlecht", "andereGruppierungsvariable")); Balkendiagramm (Variable ~ Wert | ID + andereGruppenvariable, Gruppen = Geschlecht, Daten = Daten, Auto.Key = Liste (Leerzeichen = 'richtig')) ' – user20650

+0

Funktioniert! Ist es normal, das Balkendiagramm nicht von negativ zu starten? - - Meine Spalten sind null, aber der typische Weg zeigt wenig Negativität, um sie zu zeigen. - - Gibt es hier einen guten Weg, um Gitter hinzuzufügen? - Es gibt auch einen Dummy '.1' nach jedem Spaltennamen, dessen Ursprung ich nicht verstehe. In meinen Daten sehe ich es nicht. Wie kann es aus den Barkarten entfernt werden? –

2

Sie verwenden Lattice PKG, das vom Grid PKG abhängt, daher müssen Sie die Fensterung von Grid PKG verwenden, wie in Lattice: multiple plots in one window? angewiesen. Der ggplot2 wird niemals im Code verwendet. Sie können das 2x2-Fenster mit dem Befehl grid.arrange ausführen.

Grid.arrange mit GridExtras Paket- und Paket Lattice

enter image description here

require(lattice) 
require(gridExtra) 

f<-function(x) as.double(as.character(x)) #factors converted to vectors https://stackoverflow.com/a/40680020/54964 

data.female <- structure(list(N11.1 = structure(c(3L, 3L), .Label = c("", "0.0", 
"1.0", "N11"), class = "factor"), N22.1 = structure(c(2L, 2L), .Label = c("", 
"0.0", "2.0", "N22"), class = "factor"), N33.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N33"), class = "factor"), N44.1 = structure(2:3, .Label = c("", 
"0.0", "0.1", "0.2", "N44"), class = "factor"), N21.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N21"), class = "factor"), N31.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N31"), class = "factor"), N32.1 = structure(c(5L, 
7L), .Label = c("", "0.0", "10.8", "11.0", "12.0", "17.0", "20.9", 
"22.8", "24.0", "3.0", "4.0", "44.0", "N32"), class = "factor")), .Names = c("N11.1", 
"N22.1", "N33.1", "N44.1", "N21.1", "N31.1", "N32.1"), row.names = c("Sinus", 
"Arr/AHB"), class = "data.frame") 

data.male <- structure(list(N11.1 = structure(c(3L, 3L), .Label = c("", "0.0", 
"1.0", "N11"), class = "factor"), N22.1 = structure(c(2L, 2L), .Label = c("", 
"0.0", "2.0", "N22"), class = "factor"), N33.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N33"), class = "factor"), N44.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "0.1", "0.2", "N44"), class = "factor"), 
    N21.1 = structure(c(2L, 2L), .Label = c("", "0.0", "N21"), class = "factor"), 
    N31.1 = structure(c(2L, 2L), .Label = c("", "0.0", "N31"), class = "factor"), 
    N32.1 = structure(c(11L, 9L), .Label = c("", "0.0", "10.8", 
    "11.0", "12.0", "17.0", "20.9", "22.8", "24.0", "3.0", "4.0", 
    "44.0", "N32"), class = "factor")), .Names = c("N11.1", "N22.1", 
"N33.1", "N44.1", "N21.1", "N31.1", "N32.1"), row.names = c("Sinus", 
"Arr/AHB"), class = "data.frame") 

ID<-c("Sinus","Arr/AHB") 

tl <- "female" 
p1 <- barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.female, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 
tl <- "male" 
p2 <- barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.male, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 

# Just repeat two barcharts more to get 2x2 example 
tl <- "female" 
p3 <- barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.female, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 
tl <- "male" 
p4 <- barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.male, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl) 




grid.arrange(p1,p2,p3,p4, ncol=2, nrow=2) 

wie für die gemeinsame xlabel, ylabel und so weiter, bis die letzte Zeile

grid.arrange(p1,p2,p3,p4, ncol=2, nrow=2,left=("LEFT TITLE"),right=("RIGHT"),bottom=("BOTTOM"), top=("TOP")) 

ändern enter image description here

Ps.s. Ich habe das letzte Rätsel über die gemeinsame Legende here verschoben.

+0

@Masi das ist zu einem gewissen Grad [hier] angesprochen (http://stackoverflow.com/questions/11076567/plot-a-legend-and-well-spaced-universal-y-axis-and-main-titles-in -grid-arrange), alarmiert sie dort ggplot2. – hhh

+0

Gemeinsame Legenden? –

+0

Ich kann 'legend = gtable_filter (ggplotGrob (p1)," guide-box ")' nicht anwenden. –