2015-10-04 4 views
5

Was ist der beste Weg, um eine ggplot Stil zu einem Objekt in R zu speichern? Ich weiß, dass ggplot benutzerdefinierte Designs hat, aber es gibt viele visuelle Designs, die nicht in die Theme-Funktion passen.Speichern Sie benutzerdefinierte ggplot-Stile in Objekt

Hier einige Proben (geschmolzen) Daten und eine grafische Darstellung, ich auf

library(ggplot2) 

mdf <- structure(list(group = structure(c(2L, 3L, 1L, 2L, 3L, 1L), .Label = c("democrat", 
"founder", "libertarian"), class = "factor"), variable = structure(c(1L, 
1L, 1L, 2L, 2L, 2L), .Label = c("similar", "compete"), class = "factor"), 
    value = c(0.7, 0.2, 0.4, 0.3, 0.8, 0.6)), row.names = c(NA, 
-6L), .Names = c("group", "variable", "value"), class = "data.frame") 

ggplot(mdf, aes (x=group, y=value, fill = variable)) + 
    geom_bar(stat="identity", position="dodge", alpha = 0.8) + 
    geom_bar(stat="identity", position="dodge", color = "#A9A9A9", alpha = 0.8) + 
    scale_fill_manual(values=c("#05f2ae", "#17b0c4")) + 
    geom_text(aes(x=group, y=value, ymax=value, label=value), 
      position=position_dodge(1), vjust=-1, size=12) + 
    coord_cartesian(ylim = c(0, 1)) 
    theme(plot.margin = unit(c(1,1,2,2), "cm"), 
     axis.text.x = element_text(vjust=0.5, size=20), 
     plot.title=element_text(size=20, vjust=2), 
     panel.grid.major = element_blank(), panel.grid.minor = element_blank(), 
     axis.title.x = element_blank(), axis.title.y = element_blank(), 
     panel.background = element_rect(fill = "#D9D9D9")) 

gearbeitet habe eine Menge Graphen mit dem gleichen Design und die Konstruktion in einem einzigen Objekt speichern mag ich produzieren, wie "plot_style", damit die Graphen automatisch mit dem Stil aktualisiert werden, auch wenn ich mich entscheide, sie später zu ändern. Wenn ich versuche, alles unter ggplot (...) in einem Objekt "x" zu speichern, bekomme ich einen Fehler, Error: No layers in plot. Was ist der beste Weg, um alle Elemente eines ggplot (minus der Variablen/Daten) in einem einzigen Objekt zu speichern?

Vielen Dank.

+0

Siehe '? +. Gg'. Sie können beispielsweise Ihr Grunddiagramm einem Objekt zuweisen und dann Ihr Diagramm mit einem anderen Datenrahmen aktualisieren, indem Sie%% verwenden. – Henrik

Antwort

4

Sie können eine Liste mit Anpassungen erstellen und diese dann auf jedes Diagramm anwenden. Zum Beispiel:

customPlot = list(
    theme(plot.margin = unit(c(1,1,2,2), "cm"), 
     axis.text.x = element_text(vjust=0.5, size=20), 
     plot.title=element_text(size=20, vjust=2), 
     panel.grid.major = element_blank(), panel.grid.minor = element_blank(), 
     axis.title.x = element_blank(), axis.title.y = element_blank(), 
     panel.background = element_rect(fill = "#D9D9D9")), 
    coord_cartesian(ylim = c(0, 1)), 
    scale_fill_manual(values=c("#05f2ae", "#17b0c4")) 
) 

ggplot(mdf, aes (x=group, y=value, fill = variable)) + 
    geom_bar(stat="identity", position="dodge", alpha = 0.8) + 
    geom_bar(stat="identity", position="dodge", color = "#A9A9A9", alpha = 0.8) + 
    geom_text(aes(x=group, y=value, ymax=value, label=value), 
      position=position_dodge(1), vjust=-1, size=12) + 
    customPlot 
+0

genial. Nur so verstehe ich, warum akzeptiert R eine Liste mit undefinierten Werten, aber nicht als Objekt gespeichert? Das heißt, wenn ich "list()" nicht auf "customPlot" angewendet hätte, sondern nur über <- zugewiesen hätte, hätte ich einen Fehler erhalten. – tom

+0

Ich habe nur ein rudimentäres Wissen darüber, was "ggplot" "unter der Haube" macht, aber ich denke, weil "ggplot" -Objekte bereits als Listen gespeichert sind, und in manchen Fällen sind es die nicht bewerteten Ausdrücke, die in der Liste gespeichert sind. – eipi10

+0

Übrigens, Sie können die 'geom_bar'- und' geom_text'-Aufrufe auch in 'customPlot' einfügen. Dann benötigen Sie für jedes Diagramm nur" ggplot (mdf, aes (x = Gruppe, y = Wert, Füllung = Variable)) + customPlot'. – eipi10