2011-08-30 30 views
5

Esto está en parte relacionado con mi question ayer.Agregar una línea de tendencia única a un gráfico de barras en GGPLOT2

Aquí están los datos y un diagrama creado en ggplot2.

df = data.frame(date=c(rep(2008:2013, by=1)), 
       value=c(303,407,538,696,881,1094)) 


ggplot(df, aes(date, value, width=0.64)) + 
     geom_bar(stat = "identity", fill="#336699", colour="black") + 
     ylim(c(0,1400)) + opts(title="U.S. Smartphone Users") + 
     opts(axis.text.y=theme_text(family="sans", face="bold")) + 
     opts(axis.text.x=theme_text(family="sans", face="bold")) + 
     opts(plot.title = theme_text(size=14, face="bold")) + 
     xlab("Year") + ylab("Users (in millions)") +   
     opts(axis.title.x=theme_text(family="sans")) + 
     opts(axis.title.y=theme_text(family="sans", angle=90)) + 
     geom_segment(aes(x=2007.6, xend=2013, y=550, yend=1350), arrow=arrow(length=unit(0.4,"cm"))) 

¿Es posible la producción de la línea de tendencia Squigly en el siguiente gráfico con ggplot2

que había creado la trama de R y luego hizo prettied arriba en Adobe Photoshop, y me pregunto si podía ha producido esa línea de tendencia ondulada recta en R.

Si esto no se puede hacer en ggplot2, ¿hay algún paquete R específico que sea compatible con esta tarea?

No estoy preguntando sobre la reproducción del gráfico. Eso no es un problema. Solo producir la línea de tendencia parece ser un problema.

enter image description here

+0

¿La agudización de la línea está determinada matemáticamente por los valores de las barras de alguna manera? Dudo que se pueda obtener la sombra con ggplot, pero una curva matemáticamente definida con una flecha al final debería ser. –

+0

@Brian No, no está matemáticamente determinado. La sombra no es demasiado importante, solo que la línea no es una línea recta. – ATMathew

+3

Si estuviera en @Hadley, apostaría a que diría que espera que esto no sea posible en ggplot2. – joran

Respuesta

8

De acuerdo con todos los comentarios: la línea ondulada es científicamente dudosa, ya que no se basa en un modelo estadístico de los datos. (Y parece mostrar la cantidad de usuarios de teléfonos inteligentes que se nivelan, cuando los datos no muestran tal cosa). Por lo tanto, el mejor consejo es "no lo hagas".

Ya que parece realmente interesado en la idea, sí, es posible.

Puede agregar cualquier línea que desee con geom_line. Para replicar la línea tonta en su infografía, podría hacer una línea recta más una curva sinusoidal para darle movimiento. Asumiendo que su trama fue nombrado p

p + geom_line(
    aes(date, value), 
    data = data.frame(
    date = seq(2008, 2013, length.out = n), 
    value = seq(600, 1300, length.out = n) + 100 * sin(seq(0, 4 * pi, length.out = n)) 
), 
    arrow = arrow(length = unit(0.4, "cm")) 
) 

Un mejor enfoque sería utilizar una curva suavizada de loess.

p + geom_smooth(method = "loess", se = FALSE) #maybe also span = 0.5, for extra wigglyness. 
+0

+1 por una respuesta que funciona –

3

La respuesta a su pregunta es claramente: No hagas esto con R. R no está optimizado para esto. Tendrá más rápido y más cerca de lo que desea si usa algún programa de gráficos vectoriales. Use Illustrator, Inkscape (gratis) o la herramienta gráfica que desee. Quizás también quiera crear el gráfico en R y modificarlo más tarde en uno de esos programas.

Entiendo los comentarios y también estoy de acuerdo en que este gráfico no pasa algunas pruebas. No solo las pruebas académicas, sino también la prueba de mirar y sentir que no está estancada en los noventas. Esa referencia a Edward Tufte también fue por razones estéticas. Sin embargo, creo que es una pregunta legítima que no merece el voto negativo solo porque el gráfico se ve feo. A veces, los académicos también necesitan que sus publicaciones se publiquen fuera de las revistas académicas y los gráficos son editados por editores para las masas. Por lo tanto, saber de antemano - mejor no intentes hacer esas cosas con R podría ser digno de mención.

Cuestiones relacionadas