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:
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?
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)
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)
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
.
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