2016-04-25 4 views
2

Ich benutzte diese answer um 15 Barplots (nebeneinander) in einer PDF-Seite zu plotten. Das Problem ist die Qualität der Figuren wird sehr klein.Skalieren Sie Seite-an-Seite mehrere Barplots in R

dat <- read.table("data.txt",header=TRUE) 

pdf('plot.pdf') 
m <- rbind(c(1,2,3), c(4,5,6),c(7,8,9),c(10,11,12),c(13,14,15)) 
layout(m) 
barcols <- c("red","blue","green","orange","black","yellow") 

sp <- split(dat, dat$Project) 

sapply(seq_along(sp), 
     function(x) { 
     dd <- sp[[x]] 
     m <- t(`rownames<-`(as.matrix(dd[, -(1:2)]), dd[, 1])) 
     bp <- barplot(m,ylim=c(0, 0.4),beside=TRUE,col=barcols) 
     title(main=names(sp[x])) 
     # abline(h=0) 
     } 
) 
plot(NA,xlim=c(0,1),ylim=c(0,1),ann=FALSE,axes=FALSE) 
legend(0,0.6,c("C10","C10","C03","C11","C16","C08"),fill=barcols,cex=1.5) 
dev.off() 

Das Ergebnis des obigen Codes wie folgt: enter image description here

es möglich wäre, die Zahlen zu machen, um x-Achsen-Daten lesbar, um die Größe?

Das Datenformat wie folgt:

Topic Project C10  C14  C03  C11  C16  C08 
T1  P1  0.24 0.00 0.00 0.04 0.04 0.00 
T2  P1  0.00 0.30 0.00 0.00 0.00 0.00 
T3  P1  0.04 0.04 0.00 0.24 0.00 0.00 
T4  P1  0.00 0.00 0.00 0.04 0.33 0.04 
T5  P1  0.00 0.09 0.21 0.00 0.00 0.00 
T6  P1  0.00 0.09 0.00 0.00 0.00 0.34 
T1  P2  0.20 0.00 0.00 0.04 0.00 0.04 
T2  P2  0.00 0.22 0.04 0.00 0.00 0.00 
T3  P2  0.04 0.00 0.00 0.24 0.00 0.00 
T4  P2  0.00 0.00 0.04 0.00 0.33 0.00 
T5  P2  0.04 0.00 0.21 0.00 0.00 0.00 
T6  P2  0.00 0.04 0.00 0.00 0.00 0.34 
T1  P3  0.20 0.00 0.00 0.04 0.00 0.04 
T2  P3  0.00 0.22 0.04 0.00 0.00 0.00 
T3  P3  0.04 0.00 0.00 0.24 0.00 0.00 
T4  P3  0.00 0.00 0.04 0.00 0.33 0.00 
T5  P3  0.04 0.00 0.21 0.00 0.00 0.00 
T6  P3  0.00 0.04 0.00 0.00 0.00 0.34 
... 
... 
+1

Haben Sie versucht, etwas wie 'par (mar = c (2,2,2,0) +0.1)'? Alternativ haben 'gitter' und' ggplot2' beide eine großartige Facettierungsfunktion. – r2evans

+0

Ich würde gerne Gitter verwenden, aber ich habe nicht diesen starken Hintergrund. Der ggplot2 zeigte keine Ergebnisse auf meiner Maschine !! – Sultan

Antwort

1

Hier ist, wie Sie es mit ggplot2 oder lattice tun könnte. Diese Pakete arbeiten mit "Langformat" -Daten. Für Ihren Datensatz bedeutet dies, dass die Werte der Spalten 3 bis 8 zu einer einzigen Spalte gestapelt sind, wobei eine zweite Spalte den Namen der Gruppe angibt (d. H. Die Namen der ursprünglichen Spalten, z. B. C10, C14 usw.).

tidyr ist bequem für zu lange Format Umformung:

d <- read.table(text='Topic Project C10  C14  C03  C11  C16  C08 
T1  P1  0.24 0.00 0.00 0.04 0.04 0.00 
T2  P1  0.00 0.30 0.00 0.00 0.00 0.00 
T3  P1  0.04 0.04 0.00 0.24 0.00 0.00 
T4  P1  0.00 0.00 0.00 0.04 0.33 0.04 
T5  P1  0.00 0.09 0.21 0.00 0.00 0.00 
T6  P1  0.00 0.09 0.00 0.00 0.00 0.34 
T1  P2  0.20 0.00 0.00 0.04 0.00 0.04 
T2  P2  0.00 0.22 0.04 0.00 0.00 0.00 
T3  P2  0.04 0.00 0.00 0.24 0.00 0.00 
T4  P2  0.00 0.00 0.04 0.00 0.33 0.00 
T5  P2  0.04 0.00 0.21 0.00 0.00 0.00 
T6  P2  0.00 0.04 0.00 0.00 0.00 0.34 
T1  P3  0.20 0.00 0.00 0.04 0.00 0.04 
T2  P3  0.00 0.22 0.04 0.00 0.00 0.00 
T3  P3  0.04 0.00 0.00 0.24 0.00 0.00 
T4  P3  0.00 0.00 0.04 0.00 0.33 0.00 
T5  P3  0.04 0.00 0.21 0.00 0.00 0.00 
T6  P3  0.00 0.04 0.00 0.00 0.00 0.34', header=TRUE) 

library(tidyr) 
d2 <- gather(d, Variable, Value, -Topic, -Project) 

head(d2) 

## Topic Project Variable Value 
## 1 T1  P1  C10 0.24 
## 2 T2  P1  C10 0.00 
## 3 T3  P1  C10 0.04 
## 4 T4  P1  C10 0.00 
## 5 T5  P1  C10 0.00 
## 6 T6  P1  C10 0.00  

Dann mit ggplot2:

library(ggplot2) 
ggplot(d2, aes(x=Topic, y=Value, fill=Variable)) + 
    geom_bar(stat='identity', position='dodge') + 
    facet_wrap(~Project) 

enter image description here

Oder mit lattice:

library(lattice) 
barchart(Value~Topic|Project, d2, groups=Variable, origin=0) 

enter image description here

Beide oben genannten sind in hohem Grade kundengerecht. Siehe die ggplot2docs und ?lattice::barchart.

+0

Ich habe Fehlerpaket 'Fehler in der Bibliothek (tidyr): Es gibt kein Paket namens 'tidyr'. Ich habe versucht, das Paket zu installieren, und ich habe diese tidyr 'ist nicht verfügbar (für R-Version 3.0.2) ' – Sultan

+1

Die aktuelle Version von' tidyr' (0.4.1) erfordert R-Version 3.1.0 oder höher. Sie können Ihre Version von R aktualisieren oder versuchen, eine [ältere Version von 'tidyr'] (https://cran.r-project.org/src/contrib/Archive/tidyr/) von der Quelle zu installieren. Alternativ können Sie verwenden: 'd2 <- cbind (d [, 1: 2], Variable = rep (Spaltennamen (d) [- (1: 2)], jeweils = nrow (d)), Wert = unlist (d [, - (1: 2)])) ' – jbaums

+0

Ich habe R aktualisiert und die Pakete erfolgreich installiert, und ich habe Ihr Codebeispiel kopiert und eingefügt, um es zu testen. Es läuft ohne Fehler, aber die Konsole zeigte das Diagramm? Gibt es in Ihrem Beispiel einen fehlenden Code? FYI: Ich verwendete Quelle ("Tests.R"), wo Tests.R enthält Ihr Codebeispiel. – Sultan