web-dev-qa-db-fra.com

Habillage automatique des étiquettes via labeller = label_wrap dans ggplot2

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")

Histogram with long label not wrapped

Je voudrais envelopper certaines des étiquettes les plus longues ici.

38
Til Hund

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))

enter image description here

118
Sandy Muspratt

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))
15

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 .

13
Claude

(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))
1