Me gustaría ajustar automáticamente mis etiquetas en ggplot2. Aquí está escrito cómo escribir una función (1) para ello, pero lamentablemente no sé donde poner labeller=label_wrap en mi código (2).

(1) función de hadley

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

(2) ejemplo 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")

Auto ajuste de etiquetas a través de la etiquetadora=label_wrap en ggplot2

Me gustaría para envolver algunos de los más etiquetas de aquí.

  • ¿por qué no aplicar la strwrap función a sus etiquetas fuera de ggplot2?
  • Soy nuevo en R. ¿Cómo podría aplicar la strwrap función fuera?
  • Por favor, incluya una reproducible ejemplo.
InformationsquelleAutor Til Hund | 2014-02-19

4 Comentarios

  1. 116

    Usted no necesita el label_wrap función. En lugar de utilizar el str_wrap función de la stringr paquete.

    Usted no proporciona su df marco de datos, así que crear un sencillo marco de datos, que contiene las etiquetas. A continuación, aplique la str_wrap función a las etiquetas.

    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

    Ahora para aplicar las etiquetas a un ggplot gráfico: El primer gráfico que utiliza las etiquetas originales; el segundo gráfico utiliza la modificación de las etiquetas; y para el tercer gráfico, las etiquetas son modificados en la llamada a 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))

    Auto ajuste de etiquetas a través de la etiquetadora=label_wrap en ggplot2

    • Esta solución parece estar muy cerca de mi problema. Pero, ¿y si cada gráfica tiene tres etiquetas diferentes? ¿Tengo que definir tres tipos diferentes de funcionamiento(x) con el fin de utilizar str_wrap?
    • Lo siento, no te entiendo la pregunta. La segunda llamada a ggplot es el camino a seguir. Es decir, aplicar str_wrap fuera de la convocatoria a ggplot. Si usted tiene otras variables que contienen etiquetas, a continuación, aplicar str_wrap a las variables así.
    • Creo que estamos casi allí, pero no acabo de entender cómo implementar el str_wrap a todos mis variables, por lo tanto gráficos (alrededor de 25) que tienen todos los diferentes etiquetas (véase de nuevo el código de ejemplo anterior).
    • scale_x_discrete(labels = str_wrap(c("label", "long label", "very, very long label"), width = 10))
    • Esta es una excelente @SandyMuspratt. Observación: definir su dataframe con variable y value en lugar de x y y y se hará evidente que la sintaxis es scale_x_discrete(labels = function(x) str_wrap(x, width = 10)), utilizando x y no variable como yo había supuesto incorrectamente en mi primer intento.
    • Además, puede que desee agregar + theme(axis.text.x = element_text(hjust=0)) para alinear las etiquetas a la izquierda (en el ejemplo, el 3 líneas mirada centrada).
    • El gran problema es que str_wrap vueltas factores a los personajes, por lo que el orden de nivel del factor, se pierde.

  2. 15

    Las «escalas» paquete incluye una función muy parecida a la de Claude y de 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))
  3. 13

    Aquí hay otra manera sin hacer referencia a la biblioteca de 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"))

    donde la llamada:

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

    hace el trabajo de la división de las etiquetas de forma dinámica. El resultado es el mismo que en la primera respuesta.

  4. 1

    (Esperemos) la mejora en @Claude respuesta:

    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))
    • sólo una función es suficiente function(x,width)

Dejar respuesta

Please enter your comment!
Please enter your name here