web-dev-qa-db-fra.com

Comment spécifier des colonnes dans facet_grid OR comment changer les étiquettes dans facet_wrap

J'ai un grand nombre de séries de données que je veux tracer à l'aide de petits multiples. Une combinaison de ggplot2 et de facet_wrap fait ce que je veux, ce qui donne généralement un joli petit bloc de 6 x 6 facettes. Voici une version plus simple:

facet_wrap

Le problème est que je n’ai pas un contrôle adéquat sur les étiquettes des bandes de facettes. Les noms des colonnes dans le bloc de données sont courts et je veux les conserver ainsi, mais je veux que les étiquettes des facettes soient plus descriptives. Je peux utiliser facet_grid pour pouvoir tirer parti de la fonction labeller, mais il semble alors n'y avoir aucun moyen simple de spécifier le nombre de colonnes et une longue rangée de facettes ne fonctionnent tout simplement pas pour cette tâche particulière. Est-ce que je manque quelque chose d'évident?

facet_grid

Q. Comment puis-je changer les étiquettes de facettes lors de l'utilisation de facet_wrap sans changer les noms de colonne? Sinon, comment puis-je spécifier le nombre de colonnes et de lignes lors de l'utilisation de facet_grid?

Le code pour un exemple simplifié suit. Dans la vraie vie, j'ai affaire à plusieurs groupes contenant chacun des dizaines de séries de données, chacune d'entre elles changeant fréquemment, de sorte que toute solution devrait être automatisée plutôt que de compter sur l'attribution manuelle de valeurs.

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

Je ne comprends pas bien. Vous avez déjà écrit une fonction qui convertit vos étiquettes courtes en étiquettes descriptives longues. Qu'est-ce qui ne va pas avec le simple ajout d'une nouvelle colonne et l'utilisation de facet_wrap sur cette colonne à la place?

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

Pour changer les noms des étiquettes, il suffit de changer les niveaux de facteur du facteur que vous utilisez dans facet_wrap. Ceux-ci seront utilisés dans facet_wrap sur les bandes. Vous pouvez utiliser une configuration similaire à celle que vous utiliseriez avec la fonction labeller dans facet_grid. Faites juste quelque chose comme:

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

Vous pouvez maintenant utiliser factor_variable dans facet_wrap.

8
Paul Hiemstra

Ajoutez simplement labeller = label_wrap_gen(width = 25, multi_line = TRUE) aux arguments facet_wrap()

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

Plus d'infos: ?ggplot2::label_wrap_gen

0
user3507584