2016-04-25 6 views
3

Ich habe den folgenden Code: enter image description heresapply in R mit Seiten für ploting einander Graph

:

dat <- 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", 
         header=TRUE) 
layout(matrix(c(1,2,5,3,4,5),nrow=2,byrow = TRUE)) 
#  [,1] [,2] [,3] 
#[1,] 1 2 5 
#[2,] 3 4 5 
barcols <- c("red","blue","green","orange","black","yellow") 
sapply(3:8, 
    function(x) { 
    bp <- barplot(matrix(dat[,x],nrow=2,byrow=TRUE),ylim=c(0, 0.5),beside=TRUE,col=barcols) 
    title(main=names(dat[x])) 
    axis(1,at=colMeans(bp),c("T1","T2","T3","T4","T5","T6"),lwd=0,lwd.tick=1) 
    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) 

Der obige Code zwei barplots mit der Side-by-Side-Funktion wie folgt plotten unfortunatly nur ich ein Grundstück bekommen, was falsch ist, und der Code ist inspiriert von dieser post

+1

Wie in dem verknüpften Fall würde dies viel einfacher wir ing 'ggplot2' .. – denise

Antwort

4

Der einfachste Weg für mich die ggplot artige Facettierung zu erhalten ist, schreibt eine Funktion, die eine Teilmenge der Daten und verwendet, die auf einem split nimmt, zum Beispiel

dat <- 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", 
        header=TRUE) 


layout(matrix(c(1,1,2,2,3,3),nrow=2)) 
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.5),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) 

enter image description here

+0

das ist Eigentlich was ich will. Frage: Was, wenn ich 15 Projekte (Ps) Datensatz wie P1 und P2, was soll ich tun, um alle 15 Figuren auf dem gleichen Layout zu halten? – Sultan

+0

@Sultan hängt davon ab, wie groß die Gesamtgröße ist und wie klein der Text sein wird.Wenn es zu viel Arbeit braucht, um nützliche Informationen aus einer Figur zu extrahieren, ist Ihre beste Wette, etwas anderes zu versuchen – rawr

+0

die Größe für die Datensatz wird den gleichen Stil von P1 und P2 aber wird P3 bis P15 enthalten. Die Zahlengröße ist das Thema für mich, ich möchte die Qualität und Lesbarkeit für alle behalten (P1 bis P15) und sie müssen im selben Rahmen sein !!. Haben Sie Vorschläge dafür und wie können Sie denselben Code verwenden? Ich möchte die Ergebnisse in PDF-Datei ausdrucken. – Sultan

1

Verwendung par(mfrow=c(3, 3)):

par(mfrow=c(3, 3)) 
sapply(3:8, 
     function(x) { 
      bp <- barplot(matrix(dat[,x],nrow=2,byrow=TRUE), ylim=c(0, 0.5), beside=TRUE, col=barcols) 
      title(main=names(dat[x])) 
      axis(1,at=colMeans(bp), c("T1","T2","T3","T4","T5","T6"), lwd=0, lwd.tick=1) 
      abline(h=0) 
     } 
) 
+0

es zeigt 6 Grundstücke !! während meine Daten über nur zwei Projekte (P1 und P2) sind, wie ich in der Abbildung der Frage gezeigt habe. – Sultan

+2

Nein, Sie laufen 6 Mal und rufen 'barplot()' jedes Mal. Daher sollten _ 6 Parzellen sein. –

+0

Wie könnte ich zwei für P1 und P2 machen. Ich habe gerade festgestellt, dass der Barplot auf Spalten traversiert, während ich es nur für P1 und P2 will. – Sultan

2

Hier ist eine ggplot Lösung:

library(ggplot2) 
library(reshape2) 

meltData <- melt(dat, id = c("Topic", "Project")) 
ggplot(meltData) + 
    geom_bar(aes(x = Topic, y = value, fill = variable), stat = "identity", 
      position = "dodge") + 
    facet_wrap(~Project, nrow = 2) 

Dies ist, wie das Ergebnis aussieht: ggplot version

Falls Sie die beiden Graphen nebeneinander dargestellt werden soll, geben Sie ncol = 2 statt.

Wenn Sie Ihren vorhandenen Code verwenden möchten, versuchen Sie Ihr Dataset vorher solche Umgestaltung, dass die T1..T6 sind Ihre Spalten:

library(reshape2) 

longFormat <- melt(dat, id = c("Topic", "Project")) 
wideFormat <- dcast(longFormat, Project + variable ~ Topic, value.var = "value") 
+0

Ich habe versucht mit dem ersten Code und es zeigte nicht die Ergebnisse !! der zweite Code gibt Fehler "Fehler in eval (expr, envir, enclos): konnte nicht finden Funktion" Cast " FYI: meine R-Version 3.2.4, macht das Unterschied? – Sultan

+0

oops mein schlechtes. Die Funktion heißt "dcast". Ich werde die Antwort bearbeiten. Ich füge auch ein Bild von dem hinzu, was ich bekomme, wenn ich die ggplot Version laufe. – denise

+0

Ich habe versucht, ggplot2 auszuführen, es läuft ohne Fehler, aber es zeigte die Zahlen nicht. Zu Ihrer Information: meine R-Version 3.2.4, macht das einen Unterschied? 'Bibliothek (Umformung2) Bibliothek (ggplot2) dat <- read.table (text = "....", header = TRUE) schmelzData <- schmelzen (dat, id = c (" Thema "," Projekt ")) ggplot (schmelzeDaten) + geom_bar (aes (x = Thema, y ​​= Wert, Füllung = Variable), stat = "identity", position = "ausweichen") + facet_wrap (~ Projekt, nrow = 2) ' – Sultan