webentwicklung-frage-antwort-db.com.de

Wie werden Spalten in facet_grid angegeben? OR So ändern Sie die Beschriftungen in facet_wrap

Ich habe eine große Anzahl von Datenreihen, die ich mit kleinen Vielfachen darstellen möchte. Eine Kombination aus ggplot2 und facet_wrap macht, was ich will, und ergibt normalerweise einen schönen kleinen Block von 6 x 6 Facetten. Hier ist eine einfachere Version:

facet_wrap

Das Problem ist, dass ich die Etiketten in Facettenstreifen nicht ausreichend kontrollieren kann. Die Namen der Spalten im Datenrahmen sind kurz und ich möchte sie auf diese Weise beibehalten, aber ich möchte, dass die Beschriftungen in den Facetten beschreibender sind. Ich kann facet_grid verwenden, um die labeller-Funktion nutzen zu können, aber es scheint keinen einfachen Weg zu geben, die Anzahl der Spalten anzugeben, und eine lange Reihe von Facetten funktioniert für diese bestimmte Aufgabe einfach nicht. Fehlt mir etwas offensichtliches?

facet_grid

F: Wie kann ich die Facettenbeschriftung bei der Verwendung von facet_wrap ändern, ohne die Spaltennamen zu ändern? Wie kann ich alternativ die Anzahl der Spalten und Zeilen angeben, wenn Sie facet_grid verwenden?

Code für ein vereinfachtes Beispiel folgt. Im wirklichen Leben beschäftige ich mich mit mehreren Gruppen, die jeweils Dutzende von Datenreihen enthalten, von denen jede häufig geändert wird. Daher müsste jede Lösung automatisiert werden, statt sich auf manuelles Zuweisen 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)
39
SlowLearner

Ich verstehe das nicht ganz. Sie haben bereits eine Funktion geschrieben, die Ihre kurzen Labels in lange beschreibende Labels umwandelt. Was ist daran falsch, 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)
21
joran

Um die Bezeichnungsnamen zu ändern, ändern Sie einfach die Faktorstufen des in facet_wrap verwendeten Faktors. Diese werden in facet_wrap auf den Streifen verwendet. Sie können ein ähnliches Setup verwenden, als würden Sie die Funktion labeller in facet_grid verwenden. Mach 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.

8
Paul Hiemstra

Fügen Sie einfach labeller = label_wrap_gen(width = 25, multi_line = TRUE) zu den facet_wrap()-Argumenten hinzu. 

ZB: ... + facet_wrap( ~ variable, ,labeller = label_wrap_gen(width = 25, multi_line = TRUE))

Mehr Infos: ?ggplot2::label_wrap_gen

0
user3507584