Je voudrais envelopper automatiquement mes étiquettes dans ggplot2. Ici est écrit comment écrire une fonction (1) pour cela, mais malheureusement je ne sais pas où mettre labeller=label_wrap
dans mon code (2).
(1) fonction de hadley
label_wrap <- function(variable, value) {
lapply(strwrap(as.character(value), width=25, simplify=FALSE),
paste, collapse="\n")
}
(2) exemple de code
df = data.frame(x = c("label", "long label", "very, very long label"),
y = c(10, 15, 20))
ggplot(df, aes(x, y)) + geom_bar(stat="identity")
Je voudrais envelopper certaines des étiquettes les plus longues ici.
Vous n'avez pas besoin du label_wrap
une fonction. Utilisez plutôt le str_wrap
fonction du package stringr
.
Vous ne fournissez pas votre bloc de données df
, donc je crée un bloc de données simple, celui qui contient vos étiquettes. Ensuite, appliquez le str_wrap
fonction aux étiquettes.
library(ggplot2)
library(stringr)
df = data.frame(x = c("label", "long label", "very, very long label"),
y = c(10, 15, 20))
df
df$newx = str_wrap(df$x, width = 10)
df
Maintenant, pour appliquer les étiquettes à un graphique ggplot: Le premier graphique utilise les étiquettes originales; le deuxième graphique utilise les étiquettes modifiées; et pour le troisième graphique, les étiquettes sont modifiées dans l'appel à ggplot.
ggplot(df, aes(x, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity")
ggplot(df, aes(newx, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity")
ggplot(df, aes(x, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity") +
scale_x_discrete(labels = function(x) str_wrap(x, width = 10))
Le package "échelles" comprend une fonction très similaire à celle de Claude et Leonardo: wrap_format.
library(scales)
ggplot(df, aes(x, y)) + geom_bar(stat = "identity") +
labs(x = "", y = "Number of Participants") +
scale_x_discrete(labels = wrap_format(10))
Voici une autre façon sans référence à la bibliothèque stringr
:
ggplot(df, aes(x, y)) +
xlab("") + ylab("Number of Participants") +
geom_bar(stat = "identity") +
scale_x_discrete(labels = function(x) lapply(strwrap(x, width = 10, simplify = FALSE), paste, collapse="\n"))
où l'appel:
lapply(strwrap(x, width = 10, simplify = FALSE), paste, collapse="\n")
effectue le fractionnement dynamique des étiquettes. Le résultat est le même que dans le premier réponse .
(Espérons) améliorer la réponse de @ Claude:
get_wraper <- function(width) {
function(x) {
lapply(strwrap(x, width = width, simplify = FALSE), paste, collapse="\n")
}
}
ggplot(df, aes(x, y)) + geom_bar(stat = "identity") +
labs(x = "", y = "Number of Participants") +
scale_x_discrete(labels = get_wraper(10))