2017-11-08 2 views
0

Ich versuche, jede Species Daten in Iris-Datensatz zu. Png-Datei mit for loop zu speichern. Aber zuvor wollte ich die Facettenbanddicke so verändern, wie ich es in meinem realen Datenplotting-Prozess machen musste.Speichern jeder geänderten Facette in ggplot2

Jedoch, wenn ich versuchte, jede Facette den folgenden Code darunter zu schreiben, mir nur die leeren Plots für jede dieser Arten.

Hier ist mein Versuch,

library(ggplot2) 
plot_list = list() 
for (i in unique(iris$Species)) { 
    p = ggplot(iris[iris$Species == i, ], aes(x=Sepal.Length, y=Sepal.Width)) + 
    geom_point(size=3, aes(colour=Species))+ 
    facet_wrap(~Species) 

#this part to modify facet_wrap strips 
    g1 = ggplotGrob(p) 

    pos = c(unique(subset(g1$layout, grepl("panel", g1$layout$name), select = t))) 
    for(i in pos) g1$heights[i-1] = unit(0.4,"cm") 

    grobs = which(grepl("strip", g1$layout$name)) 
    for(i in grobs) g1$grobs[[i]]$heights <- unit(1, "npc") 

    grid.newpage() 
    grid.draw(g1) 
    plot_list[[i]] = g1 
} 

#finally write the modified graphs to file 


for (i in 1:3) { 
    file_name = paste("iris_plot_", i, ".png", sep="") 
    tiff(file_name) 
    print(plot_list[[i]]) 
    dev.off() 
} 

Derzeit dieser Code die leeren Graphen produziert und weiß nicht, warum! Jede Hilfe wird geschätzt!

Antwort

2

Sie müssen die Höhe des Streifens nicht mit ggplotGrob ändern. den entsprechenden Parameter in ggplot der Einstellung theme() tun würde:

p1 = ggplot(iris[iris$Species == "setosa",], 
      aes(x = Sepal.Length, y = Sepal.Width)) + 
    geom_point() + 
    facet_wrap(~Species) 

p2 = p1 + theme(strip.text.x = element_text(margin = margin(t = 10, b = 10))) 
# note: default margin for top & bottom is 5.5 

gridExtra::grid.arrange(p1, p2, ncol = 2) 

comparison

Was den Rest angeht, können Sie möchten die Länge plot_list nach der ersten Schleife überprüfen. Sie haben zunächst i zugewiesen, um die eindeutigen Werte von iris$Species zu übernehmen, und dann versucht, es als Index für die Liste der Diagramme zu verwenden. Die ersten drei Elemente von plot_list enthielten keine Plots.

Folgendes würde in diesem Beispiel funktionieren. Sie müssen wahrscheinlich einige Änderungen für den tatsächlichen Anwendungsfall vornehmen:

plot_list = list() 
loop.list <- unique(iris$Species) 
for (i in seq_along(loop.list)) { 
    p = ggplot(iris[iris$Species == loop.list[i], ], 
      aes(x = Sepal.Length, y=Sepal.Width)) + 
    geom_point(size = 3, aes(colour = Species))+ 
    facet_wrap(~Species) + 
    theme(strip.text.x = element_text(margin = margin(t = 11, b = 11))) 

    plot_list[[i]] <- ggplotGrob(p) 
} 

for (i in 1:3) { 
    file_name = paste("iris_plot_", i, ".png", sep="") 
    tiff(file_name) 
    grid.draw(plot_list[[i]]) 
    dev.off() 
} 
+0

Hallo. Danke für die Kommentare und Ihre Lösung. Eigentlich bin ich mir der Einstellung bewusst, dass die Textgröße eine Lösung ist, aber nicht die richtige, die ich erlebt habe. Weil, wenn Sie viele Facetten haben und Sie den Streifentext sehr klein machen, ist es sehr schwierig, strip Text zu sehen. Die Wende-Methode ist die Ausdünnung der Stripes wie in meinem OP-Code. – Alexander

+0

Ich fragte in [hier] https://stackoverflow.com/questions/36783189/changing-the-appearance-of-facet-labels-size – Alexander

+0

@Alexander Wenn Sie Änderungen im Grob-Objekt behalten wollen, einfach behalten Ihre Schleifenzähler gerade. Ein Weg (wie oben gezeigt) besteht darin, "i" den Index jedes Wertes in "unique (iris $ Species)" anstelle des Werts selbst übernehmen zu lassen, und wenn Sie mehr Schleifen in dieser Schleife haben, verwenden Sie einen anderen Zähler, z.B 'j'. –

Verwandte Themen