2014-01-21 7 views
6

Ich machte ggplot, die Bevölkerungszahlen von einer Art darstellt. Dieses Skript funktioniert gut. Also habe ich for-loop gemacht, um diese Handlung für 25 Arten zu erzeugen, aber es funktioniert nicht.Grundstück mit ggplot in for-Schleife funktioniert nicht

Hier ist ein Beispiel für eine Spezies:

A <- data.frame(sp="A",x=c(rep(0.1,3),rep(2,3),rep(4.5:8.5,4),6.5), width=c(rep(NA,3), rep(4,3), rep(1,20),5),y=c(rep(1:3,2), rep(1:4, each=5),5),col=c(rep("white",21), rep("grey80",6)), name1=c("C.I. (%)","C.N. (%)", rep("",25)), name1i=c(rep("",2), "Total",rep("",24)), nb1=c(rep(NA,7),1.33,0.53,0.52,0.42,NA,27.12,10.90,10.55,8.56,rep(NA,11)),nb2=c(rep(NA,16),24754,13558,5449,5273,4281,rep(NA,6)),nb3=c(rep(NA,6),2.43,rep(NA,4),49.51, rep(NA,15)), name2=c(rep("",21),"J","F","M","A","M","Month")) 

library(ggplot2) 
library(gridExtra) 
    table <- A 
    windows() 
    ggplot(table, aes(x=x, y=y, width=width, fill=col))+ 
    geom_tile(colour="black")+ 
    scale_fill_manual(values = c("white"="white", "grey80"="grey80"),  
         breaks = levels(table$col), na.value = "white")+ 
    geom_text(aes(label=name1), size=6, hjust=0)+ 
    geom_text(aes(label=name1i), size=6, hjust=0, fontface=3)+ 
    geom_text(aes(label=nb1), size=6)+ 
    geom_text(aes(label=nb2), size=6, fontface=3)+ 
    geom_text(aes(label=nb3), size=6, fontface="bold")+ 
    geom_text(aes(label=name2), size=6, fontface="bold")+ 
    coord_cartesian(xlim=c(0,9), ylim=c(0.5,5.5))+ 
    labs(x = "",y = "") +     
    scale_x_discrete(expand = c(0, 0)) + 
    scale_y_discrete(expand = c(0, 0))+  
    theme(axis.ticks = element_blank(),  
      axis.text = element_blank(),  
      legend.position = "none",   
      panel.background = element_rect(fill='white', colour='white'), 
      plot.margin = unit(c(0.5,0.5,-1,-1), "lines")) 

enter image description here

Und für zwei Arten mit for-Schleife:

A <- data.frame(sp="A",x=c(rep(0.1,3),rep(2,3),rep(4.5:8.5,4),6.5), width=c(rep(NA,3), rep(4,3), rep(1,20),5),y=c(rep(1:3,2), rep(1:4, each=5),5),col=c(rep("white",21), rep("grey80",6)), name1=c("C.I. (%)","C.N. (%)", rep("",25)), name1i=c(rep("",2), "Total",rep("",24)), nb1=c(rep(NA,7),1.33,0.53,0.52,0.42,NA,27.12,10.90,10.55,8.56,rep(NA,11)),nb2=c(rep(NA,16),24754,13558,5449,5273,4281,rep(NA,6)),nb3=c(rep(NA,6),2.43,rep(NA,4),49.51, rep(NA,15)), name2=c(rep("",21),"J","F","M","A","M","Month")) 
B <- data.frame(sp="B",x=c(rep(0.1,3),rep(2,3),rep(4.5:8.5,4),6.5), width=c(rep(NA,3), rep(4,3), rep(1,20),5),y=c(rep(1:3,2), rep(1:4, each=5),5),col=c(rep("white",21), rep("grey80",6)), name1=c("C.I. (%)","C.N. (%)", rep("",25)), name1i=c(rep("",2), "Total",rep("",24)), nb1=c(rep(NA,6),4.5,6.74,3.43,3.56,NA,19.89,29.82,15.18,15.75,rep(NA,12)),nb2=c(rep(NA,16),3282,4920,2504,2599,5328,rep(NA,6)),nb3=c(rep(NA,10),7.30,rep(NA,4),32.29, rep(NA,11)), name2=c(rep("",21),"J","F","M","A","M","Month")) 
data <- rbind(A,B) 
sp <- c("A","B") 

library(ggplot2) 
library(gridExtra) 
for(i in sp){ 
    table <- data[data$sp==i,] 
    windows() 
    ggplot(table, aes(x=x, y=y, width=width, fill=col))+ 
    geom_tile(colour="black")+ 
    scale_fill_manual(values = c("white"="white", "grey80"="grey80"),  
         breaks = levels(table$col), na.value = "white")+ 
    geom_text(aes(label=name1), size=6, hjust=0)+ 
    geom_text(aes(label=name1i), size=6, hjust=0, fontface=3)+ 
    geom_text(aes(label=nb1), size=6)+ 
    geom_text(aes(label=nb2), size=6, fontface=3)+ 
    geom_text(aes(label=nb3), size=6, fontface="bold")+ 
    geom_text(aes(label=name2), size=6, fontface="bold")+ 
    coord_cartesian(xlim=c(0,9), ylim=c(0.5,5.5))+ 
    labs(x = "",y = "") +     
    scale_x_discrete(expand = c(0, 0)) + 
    scale_y_discrete(expand = c(0, 0))+  
    theme(axis.ticks = element_blank(),  
      axis.text = element_blank(),  
      legend.position = "none",   
      panel.background = element_rect(fill='white', colour='white'), 
      plot.margin = unit(c(0.5,0.5,-1,-1), "lines")) 
} 

Plot ohne Fehlermeldung leer ist, so dass ich nicht verstehe, wo ist mein Fehler. Ist es nur ein Problem mit ggplot? In der Tat denke ich nicht, weil andere ggplot gut mit for-Schleife funktioniert ... Haben Sie eine Idee? Danke für Ihre Hilfe!

+0

'pl = plyr :: dlply (Daten, "sp",„% +% ", e1 = letzter_Plot()); do.call (grid.arrange, pl) ' – baptiste

+0

@Ma. Ich habe meine Antwort gelöscht, da sie nicht funktioniert hat. – amzu

+0

Danke Baptiste und amzu für Ihr Interesse an meinem Problem. Ich denke, einfachste Lösung ist @ Jlhoward Antwort. –

Antwort

13

Das Problem ist die for-Schleife. Sie müssen den Ausdruck in einer Schleife verwenden.

for (i in sp) { 
    table <- data[data$sp=="A",] 
    windows() 
    ggp <- ggplot(...) + ... 
    print(ggp) 
} 

dieses einfache Beispiel betrachten:

library(ggplot2) 
df=data.frame(x=1:10,y=rnorm(10))      # sample data 
ggplot(df)+geom_point(aes(x,y))       # render ggplot 
for (i in 1:2) ggplot(df)+geom_point(aes(x,y))   # nothing 
for (i in 1:2) print(ggplot(df) + geom_point(aes(x,y))) # renders 

Auch, wie @ user229552 sagt, Sie beide Male die gleiche Tabelle verwenden.

+0

Ja! Vielen Dank, es funktioniert gut! –

2

Zunächst einmal sieht es so aus, als würden Sie immer die Untermenge "A" auswählen. Der Anfang der for-Schleife sollte wie folgt aussehen:

for(i in sp){ 
table <- data[data$sp==i,] 
+0

Sie haben Recht, es war nur ein Fehler von mir. –

0

print() verwendet, ist erforderlich, um mit qplot() als auch in für die Schleife

z.B. Ich hatte das folgende Format von Code, sondern nur leere Bilddateien erstellt wurden, als qplot()

for(loop1 in rangestart:rangeend) 
{ 
    .......... 
    .......... 
    png(Imagefile,width=1366,height=768) 
    qplot(.....) 
    dev.off() 
} 

Ersetzen qplot(.....) mit print(qplot(.....)) mit löste das Problem