Agrupamento automático de etiquetas via labeller = label_wrap em ggplot2

Eu gostaria de quebrar automaticamente meus labels no ggplot2. Aqui está escrito como escrever uma function (1) para isso, mas infelizmente eu não sei onde colocar labeller=label_wrap no meu código (2).

(1) function por hadley

 label_wrap <- function(variable, value) { lapply(strwrap(as.character(value), width=25, simplify=FALSE), paste, collapse="\n") } 

(2) exemplo de código

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

Histograma com etiqueta longa não embrulhada

Eu gostaria de include alguns dos labels mais longos aqui.

Você não precisa da function label_wrap . Em vez disso, use a function stringr pacote stringr .

Você não fornece seu quadro de dados df , então eu crio um quadro de dados simples, um que contenha seus labels. Em seguida, aplique a function str_wrap aos labels.

 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 

Agora, para aplicar os labels a um gráfico ggplot: O primeiro gráfico usa os labels originais; o segundo gráfico usa os labels modificados; e para o terceiro gráfico, os labels são modificados na chamada para 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)) 

insira a descrição da imagem aqui

Aqui está outra maneira sem referência à biblioteca 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")) 

onde a chamada:

 lapply(strwrap(x, width = 10, simplify = FALSE), paste, collapse="\n") 

faz o trabalho de dividir os labels dinamicamente. O resultado é o mesmo da primeira resposta .

O pacote “escalas” inclui uma function muito parecida com a de Claude e 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)) 

(Esperançosamente) melhorando na resposta do @ 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))