2010-11-19 29 views
16

Estoy tratando de usar geom_point para ilustrar el recuento de mis datos. También me gustaría anotar algunos de los puntos en mi gráfico con geom_text. Cuando agrego la llamada al geom_text, parece que está trazando algo debajo de los puntos en la leyenda. He intentado invertir el orden de las capas en vano. No puedo entender por qué está haciendo esto. ¿Alguien ha visto esto antes?problema de la leyenda ggplot con el punto geom y geom

set.seed(42) 
df <- data.frame(x = 1:10 
    , y = 1:10 
    , label = sample(LETTERS,10, replace = TRUE) 
    , count = sample(1:300, 10, replace = FALSE) 
) 

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2)) 

alt text

Respuesta

24

Esto me pasó a mí todo el tiempo. El truco está en saber que aes() asigna datos a la estética. Si no hay datos para mapear (p. Ej., Si tiene un único valor que usted determine), no hay ninguna razón para usar aes(). Creo que solo las cosas dentro de un aes() aparecerán en su leyenda.

Además, cuando especifica mapeos dentro de ggplot(aes()), esas asignaciones se aplican a cada capa subsiguiente. Eso es bueno para su xey, ya que ambos geom_point y geom_text los usan. Eso es malo para size = count, ya que eso solo se aplica a los puntos.

Así que estos son mis dos reglas para prevenir este tipo de cosas:

  1. asignaciones basadas en datos sólo puso dentro de aes(). Si el argumento toma un único valor predeterminado, páselo a la capa fuera de de aes().
  2. Datos de mapa solo para las capas que lo usarán. Corolario: solo datos de mapa dentro de ggplot(aes()) si está seguro de que cada capa subsiguiente lo usará. De lo contrario, asócielo en el nivel de la capa.

Así que me gustaría trazar esta así:

p <- ggplot(data = df, aes(x = x, y = y)) + geom_point(aes(size = count)) 
p + geom_text(aes(label = label), size = 4, vjust = 2) 
+2

¡Tus dos reglas son pertinentes! – kohske

+0

Consejos muy útiles para saber para el futuro, todavía estoy tratando de entender las mejores prácticas con ggplot2. ¿Tiene alguna sugerencia para subdividir el objeto de datos para trazar? Por ejemplo, si solo quiere anotar el primer y último punto? He estado usando algo como 'geom_text (data = df [grep (" xxx ", df $ label),], aes (x = ...))'. ¿Hay una mejor manera de hacerlo? – Chase

+0

Chase - esa es una buena pregunta. Podría ser sabio hacer una nueva pregunta; Tengo algunas nociones vagas, pero es probable que alguien más tenga una idea concreta. –

17

o, si es necesario especificar el tamaño del texto dentro de las AES, a continuación, la leyenda = FALSO dibujo las leyendas de la geom suprimir:

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2), show_guide = FALSE) 
+1

Ah, nunca se me ocurrió usar eso en el nivel de capa. Bien hecho. –

+0

¡Es un buen truco para saber! Gracias. – Chase

+2

Solo una pequeña información: "leyenda" ha sido reemplazada por "show_guides": el argumento "leyenda" en geom_XXX y stat_XXX está en desuso. Utilice show_guide = TRUE o show_guide = FALSE para mostrar o suprimir la visualización de la guía. " – Andreas

Cuestiones relacionadas