2012-04-14 2 views
36

Ich habe eine große Anzahl von Datenreihen, die ich mit kleinen Vielfachen plotten möchte. Eine Kombination von ggplot2 und facet_wrap macht was ich will, typischerweise ergibt sich daraus ein schöner kleiner Block von 6 x 6 Facetten. Hier ist eine einfachere Version:Wie man Spalten in facet_grid angibt ODER wie man Beschriftungen in facet_wrap ändert

facet_wrap

Das Problem ist, dass ich nicht eine ausreichende Kontrolle über die Etiketten in Facette Streifen verfügen. Die Namen der Spalten im Datenrahmen sind kurz und ich möchte sie so behalten, aber die Beschriftungen in den Facetten sollten aussagekräftiger sein. Ich kann facet_grid verwenden, so dass ich die Funktion labeller nutzen kann, aber dann scheint es keine direkte Möglichkeit zu geben, die Anzahl der Spalten anzugeben, und eine lange Reihe von Facetten funktioniert einfach nicht für diese spezielle Aufgabe. Fehle ich etwas Offensichtliches?

facet_grid

Frage: Wie kann ich die Facette Etiketten ändern, wenn facet_wrap verwenden, ohne die Spaltennamen zu ändern? Alternativ, wie kann ich die Anzahl der Spalten und Zeilen bei der Verwendung von facet_grid angeben?

Code für ein vereinfachtes Beispiel folgt. Im wirklichen Leben habe ich es mit mehreren Gruppen zu tun, die jeweils Dutzende von Datenreihen enthalten, von denen sich jede häufig ändert, so dass jede Lösung automatisiert werden müsste, anstatt sich auf die manuelle Zuweisung von Werten zu verlassen.

require(ggplot2) 
require(reshape) 

# Random data with short column names 
set.seed(123) 
myrows <- 30 
mydf <- data.frame(date = seq(as.Date('2012-01-01'), by = "day", length.out = myrows), 
        aa = runif(myrows, min=1, max=2), 
        bb = runif(myrows, min=1, max=2), 
        cc = runif(myrows, min=1, max=2), 
        dd = runif(myrows, min=1, max=2), 
        ee = runif(myrows, min=1, max=2), 
        ff = runif(myrows, min=1, max=2)) 

# Plot using facet wrap - we want to specify the columns 
# and the rows and this works just fine, we have a little block 
# of 2 columns and 3 rows 

mydf <- melt(mydf, id = c('date')) 

p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) + 
    geom_line() + 
    facet_wrap(~ variable, ncol = 2) 
print (p1) 

# Problem: we want more descriptive labels without changing column names. 
# We can change the labels, but doing so requires us to 
# switch from facet_wrap to facet_grid 
# However, in facet_grid we can't specify the columns and rows... 

mf_labeller <- function(var, value){ # lifted bodily from the R Cookbook 
    value <- as.character(value) 
    if (var=="variable") { 
     value[value=="aa"] <- "A long label" 
     value[value=="bb"] <- "B Partners" 
     value[value=="cc"] <- "CC Inc." 
     value[value=="dd"] <- "DD Company" 
     value[value=="ee"] <- "Eeeeeek!" 
     value[value=="ff"] <- "Final" 
    } 
    return(value) 
} 

p2 <- ggplot(mydf, aes(y = value, x = date, group = variable)) + 
    geom_line() + 
    facet_grid(~ variable, labeller = mf_labeller) 
print (p2) 
+4

Dies ist ein [offenes Problem] (https://github.com/hadley/ggplot2/issues/25), aber in Ihrem speziellen Fall (einfaches Umbenennen, kein bquote oder plotmath) können Sie die Variablen einfach vorher umbenennen. – baptiste

+1

@baptiste Ich war mir nicht bewusst, dass es ein offenes Problem war (und das ist seit zwei Jahren so, wahrscheinlich wird sich das wahrscheinlich bald nicht ändern). Suspect hadley braucht mehr Studenten, um das Projekt zu beginnen! – SlowLearner

+1

oder R-savvy Freiwillige – baptiste

Antwort

19

Ich verstehe nicht ganz. Sie haben bereits eine Funktion geschrieben, die Ihre kurzen Etiketten in lange beschreibende Etiketten konvertiert. Was ist falsch daran, einfach eine neue Spalte hinzuzufügen und stattdessen facet_wrap für diese Spalte zu verwenden?

mydf <- melt(mydf, id = c('date')) 
mydf$variableLab <- mf_labeller('variable',mydf$variable) 

p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) + 
    geom_line() + 
    facet_wrap(~ variableLab, ncol = 2) 
print (p1) 
+8

Nichts ist falsch mit dem Hinzufügen einer neuen Spalte - mein Gehirn gab kurz vor dem letzten Schritt auf! Ich hätte das wissen müssen. "Im Zweifelsfall Spalte zum Datenrahmen hinzufügen" ist praktisch die Standardhilfeanweisung für ggplot. Vielen Dank. – SlowLearner

+0

Bitte helfen, ich benutze diese Funktion und der folgende Fehler sagt: 'In If (Variable == Wert) {: die Bedingung hat Länge> 1 und nur das erste Element wird verwendet werden, wo' VariableLab' 0 Elemente hat nach der Ausführung. –

+0

Ich denke, Sie müssen verwenden, wenn (Variable [i] == Wert [i]) in einer for-Schleife über die Länge Ihres Datenrahmens, um Ihren Fehler zu überwinden – alily

8

Um die Markennamen zu ändern, nur die Ebenen Faktor der Sie in facet_wrap verwenden Faktor ändern. Diese werden in facet_wrap auf den Streifen verwendet. Sie können eine ähnliche Konfiguration verwenden, wie Sie die labeller Funktion in facet_grid verwenden. Tun Sie einfach so etwas wie:

new_labels = sapply(levels(df$factor_variable), custom_labeller_function) 
df$factor_variable = factor(df$factor_variable, levels = new_labels) 

Jetzt können Sie factor_variable in facet_wrap verwenden.

+0

danke, dies auch ein nützlicher Ansatz. – SlowLearner