2016-03-28 7 views
1

Ich versuche, iterativ alle möglichen Plots meiner Daten zu erstellen, farbig von jeder Spalte in einer Tabelle.Wie man Schließungen in R bekämpft?

Bisher habe ich diesen Code:

# ----- next is a function taken from http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ 
    # --- not relevant to the question, my code is in the end of the snippet 
    library(ggplot2) 
    multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) { 
    library(grid) 

    # Make a list from the ... arguments and plotlist 
    plots <- c(list(...), plotlist) 

    numPlots = length(plots) 

    # If layout is NULL, then use 'cols' to determine layout 
    if (is.null(layout)) { 
    # Make the panel 
    # ncol: Number of columns of plots 
    # nrow: Number of rows needed, calculated from # of cols 
    layout <- matrix(seq(1, cols * ceiling(numPlots/cols)), 
        ncol = cols, nrow = ceiling(numPlots/cols)) 
    } 

    if (numPlots==1) { 
    print(plots[[1]]) 

    } else { 
    # Set up the page 
    grid.newpage() 
    pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout)))) 

    # Make each plot, in the correct location 
    for (i in 1:numPlots) { 
     # Get the i,j matrix positions of the regions that contain this subplot 
     matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE)) 

     print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row, 
             layout.pos.col = matchidx$col)) 
    } 
    } 
} 

#---------------------------------------------------------------- 
temp23_before6 <- data.frame(TIME = c(1, 2, 3, 4, 5), 
         VALUE = c(1, 2, 3, 4, 5), 
         P = c(1, 2, 3, 2, 1), 
         D = c(4, 5, 6, 7, 8)) 
i <- 1 
p <- list() 
for (col in names(temp23_before6)) { 
    l <-length(unique(temp23_before6[, col])) 
    if (l < 20 && l > 1) { 
    cc <- col 
    p[[i]] <- ggplot(temp23_before6, aes(TIME, VALUE, colour=factor(temp23_before6[, cc]))) + 
       geom_point() + labs(title=col) 

    i <- i + 1 
    } 
} 
multiplot(plotlist = p, cols = as.integer(sqrt(i))) 

Leider ist cc nicht wegen Schließung geändert, und ich erhalten alle Parzellen genau das gleiche. Der übliche Trick, der mit anderen Sprachen funktioniert - Zuweisung col an eine lokale Variable - funktioniert nicht. Wie kann ich es in R arbeiten lassen?

Aktualisierung Aktualisierter Code, damit das Beispiel in einem neuen R env ausgeführt werden kann. Ich erwarte, dass diese vier Plots eine andere Farbe haben. Die beiden Time und Value sollte offensichtlich einfarbiger sein, und die anderen beiden P und D sollten unterschiedliche Farben haben, von P = c(1, 2, 3, 2, 1), D = c(4, 5, 6, 7, 8) bestimmt, so sollte D 5 verschiedene Farben haben, und P sollte nur 3

+0

'c' ist ein Objekt, existiert bereits in R und sollte nicht überschrieben werden. Da Sie eine 'for'-Schleife schreiben, gibt es keinen Unterschied zwischen" lokalen "und" globalen "Variablen, da Sie keinen anderen Bereich angeben. Ich verstehe nicht, warum Sie überhaupt 'col' zu' c' zuweisen müssen, da es nur einmal aufgerufen wird und nur mit 'col' aufgerufen werden kann. Funktioniert Ihr Code, wenn Sie 'color = factor (temp23_before6 [, c])' durch 'color = factor (temp23_before6 [, col])' 'ersetzen? – brittenb

+0

@Batanichek Total verpasst. Aber das hilft leider nicht – Archeg

+0

@brittenb Nein, wenn ich es mit "col" ersetze macht es immer noch dasselbe.Der übliche Trick in anderen Sprachen (C#, Java) besteht darin, eine lokale Variable für eine Closure zu erstellen, also wird für jede Variable eine separate lokale Variable verwendet (also haben Sie die gleiche Anzahl an lokalen Variablen wie dort in der Array-Summe). so schließt jeder für den Lauf getrennt über seine eigene 'c' -Instanz). Aber anscheinend funktioniert das nicht in R – Archeg

Antwort

6

Dieses Problem hat mehr mit Programmierung innerhalb der hadlyverse zu tun. Wir zwei Änderungen vornehmen, 1) in aes_string Auswertung innerhalb des ggplot Aufruf zu ermöglichen, und 2) die Legende aufzuräumen durch die Färbung Spalte genannt werden:

p[[i]] <- ggplot(temp23_before6, aes_string("TIME", "VALUE", 
      colour=factor(temp23_before6[,cc]))) + 
      geom_point() + labs(title=col) + scale_colour_discrete(name=cc) 

enter image description here

+0

Kannst du kurz erklären, was "aes_string" anders macht, dass es sich daran erinnert, was die Farbzuweisungen waren? Nur zu meiner eigenen Information. – brittenb

+2

@brittenb ermöglicht die Standardauswertung im Gegensatz zum interaktiven NSE-Modus. Hier ist mehr https://nsaunders.wordpress.com/2013/02/26/rggplot2-tip-aes_string/ –

0

habe ich denke, Das Problem liegt darin, wie ggplot seine Farben beim Drucken der Handlung verweist. Ich bin mir da nicht ganz sicher, aber schauen wir uns ein Beispiel an.

temp23_before6 <- data.frame(TIME = c(1, 2, 3, 4, 5), 
          VALUE = c(1, 2, 3, 4, 5), 
          P = c(1, 2, 3, 2, 1), 
          D = c(4, 5, 6, 7, 8)) 
i <- 1 
p <- list() 
for (column in names(temp23_before6)) { 
    l <-length(unique(temp23_before6[, column])) 
    if (l < 20 && l > 1) { 
    colors <- factor(temp23_before6[, column]) 
    print(colors) 
    p[[i]] <- ggplot(temp23_before6, aes(TIME, VALUE, colour=colors)) + 
     geom_point() + labs(title=column) 

    i <- i + 1 
    } 
} 

plot(p[[1]]) 

Im Beispiel sehen Sie, dass ich die Zuweisung von column-cc entfernt, da wir das nicht brauchen, und ich setze explizit die Farbe Variable verwendet werden. Wenn wir den obigen Code ausführen, läuft alles ohne Fehler, aber wie das OP festgestellt hat, ist jedes Diagramm genau dasselbe. Außerdem stellen wir fest, dass die Faktorstufen der Farben in allen Plots identisch sind und den Faktorstufen der letzten Iteration entsprechen. Das brachte mich dazu, darüber nachzudenken, wie ggplot die Farben zuweist. Ändern wir also colors, um etwas anderes zu sein, und führen Sie ein Plot erneut aus, das bereits generiert wurde.

colors <- factor(20:30) 
plot[[p1]] 

Dies gibt uns einen Fehler, uns zu sagen, dass die Ästhetik muss entweder Länge 1 oder die gleichen wie die Daten (5) sein. Dies scheint zu implizieren, dass zum Zeitpunkt des Plottens die Daten, die zum Zuordnen der Farben verwendet werden, zu diesem Zeitpunkt gezeichnet sind und nicht "gespeichert" sind. Wenn Sie also Ihre multiplot-Funktion ausführen, zeichnen alle Diagramme aus den gleichen Daten, um die Farben zuzuweisen. In diesem Fall ist temp23_before6[, column]column jetzt statisch und wird als letzter Spaltenname gespeichert.

+1

Es scheint nicht wie 'assign' das Problem leider zu lösen. Wenn ich 5 Variablen erstelle, muss ich dann noch die Farbe einstellen wie 'color = get (paste0 (" colors_ ", i))' und 'i' ist immer gleich 5, wenn ich den Code starte – Archeg

+0

Ja, das ist mir aufgefallen versucht, die Problemumgehung zu implementieren. Als Ergebnis habe ich diesen Teil der Antwort gelöscht. – brittenb

Verwandte Themen