2012-06-08 10 views
27

Al agregar texto de anotación a un trazado, noté que geom_text() producía un texto desagradable y desigual, mientras que annotate() producía un texto suave y agradable. ¿Alguien sabe por qué sucede esto y si hay alguna forma de solucionarlo? Sé que podría usar annotate() aquí, pero probablemente haya casos en los que sea preferible geom_text(), y me gustaría encontrar una solución. Además, geom_text() no puede ser previsto para dar texto de aspecto pobre, así que o bien estoy haciendo algo mal, o me he encontrado con algún tipo de efecto secundario sutil.ggplot2: ¿Hay alguna solución para el texto irregular y de baja calidad producido por geom_text()?

Aquí hay algunos datos falsos y el código para producir el gráfico, más una imagen que muestra los resultados.

library(ggplot2) 
age = structure(list(age = c(41L, 40L, 43L, 44L, 40L, 42L, 44L, 45L, 
     44L, 41L, 43L, 40L, 43L, 43L, 40L, 42L, 43L, 44L, 43L, 41L)), 
     .Names = "age", row.names = c(NA, -20L), class = "data.frame") 
ggplot(age, aes(age)) + 
    geom_histogram() + 
    scale_x_continuous(breaks=seq(40,45,1)) + 
    stat_bin(binwidth=1, color="black", fill="blue") + 
    geom_text(aes(41, 5.2, 
      label=paste("Average = ", round(mean(age),1))), size=12) + 
    annotate("text", x=41, y=4.5, 
      label=paste("Average = ", round(mean(age$age),1)), size=12) 

enter image description here

+0

usando la estructura está muy bien, pero no se olvide de asignar: '' '' edad = structure' '' '. He editado tu ejemplo. –

+0

Mi solución es generar todos los elementos importantes en 'ggplot', luego' ggsave (file = "plot.eps") 'y editar eso con Adobe Illustrator u otro programa de gráficos vectoriales para obtener cifras de calidad de publicaciones. – Maiasaura

Respuesta

51

geom_text, a pesar de no usar nada directamente de la age hoja.de.datos, se sigue utilizando para su origen de datos. Por lo tanto, está poniendo 20 copias de "Promedio = 42.3" en la trama, una para cada fila. Es esa sobrescritura múltiple lo que lo hace parecer tan malo. geom_text está diseñado para poner texto en un gráfico donde la información proviene de un data.frame (que se da, ya sea directa o indirectamente en la llamada original ggplot). annotate está diseñado para adiciones únicas y únicas como las que tiene (crea un geom_text, cuidando la fuente de datos).

Si realmente desea utilizar geom_text(), simplemente restablecer la fuente de datos:

ggplot(age, aes(age)) + 
    scale_x_continuous(breaks=seq(40,45,1)) + 
    stat_bin(binwidth=1, color="black", fill="blue") + 
    geom_text(aes(41, 5.2, 
      label=paste("Average = ", round(mean(age$age),1))), size=12, 
      data = data.frame()) + 
    annotate("text", x=41, y=4.5, 
      label=paste("Average = ", round(mean(age$age),1)), size=12) 

enter image description here

+0

Es bueno entender cómo funciona 'geom_text()'. Gracias por tu ayuda, Brian. – eipi10

+0

+1 Brian, un ejemplo de una respuesta bien escrita e ilustrada y una sugerencia útil re 'anotar()'. –

+0

¿no debería ser 'mean (age $ age)' para 'geom_text' ya que restableció los datos? – colinfang

Cuestiones relacionadas