2010-12-02 16 views
9

Estoy buscando una manera de trazar un gráfico de barras que contenga dos series diferentes, esconder las barras de una de las series y en su lugar tener una línea (sin problemas si es posible) pasar por la parte superior de las barras de la serie oculta sido (similar a cómo se podría superponer un polinomio de frecuencia en un histograma). He intentado con el ejemplo a continuación, pero parece que se encuentra con dos problemas.¿Cómo se puede superponer una línea en un diagrama de barra usando ggplot2?

Primero, necesito resumir (totalizar) los datos por grupo, y segundo, me gustaría convertir una de las series (df2) en una línea.

df <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,1,2,2,3,3)) 
df2 <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,4,3,5,1,2)) 
ggplot(df, aes(x=grp, y=val)) + 
    geom_bar(stat="identity", alpha=0.75) + 
    geom_bar(data=df2, aes(x=grp, y=val), stat="identity", position="dodge") 

Respuesta

11

Tal vez los datos de muestra que no son representativos de los datos reales que está trabajando, pero no hay líneas que se pueden extraer de df2. Solo hay un valor para cada valor xey. Aquí hay una versión de su modifed df2 con suficientes puntos de datos para construir líneas:

df <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,2,3,1,2,3)) 
df2 <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,4,3,5,0,2)) 

p <- ggplot(df, aes(x=grp, y=val)) 
p <- p + geom_bar(stat="identity", alpha=0.75) 

p + geom_line(data=df2, aes(x=grp, y=val), colour="blue") 

Alternativamente, si los datos del ejemplo anterior es correcta, puede representar esta información como punto de geom_point(data = df2, aes(x = grp, y = val), colour = "red", size = 6). Obviamente puedes cambiar el color y el tamaño a tu gusto.

EDIT: En respuesta al comentario

No estoy del todo seguro de lo que el visual para un polinomio frec durante un histograma se supone para parecerse. ¿Se supone que los valores x están conectados entre sí? En segundo lugar, sigues refiriéndote a querer líneas, pero tu código muestra geom_bar(), que supongo que no es lo que quieres. Si quiere líneas, use geom_lines(). Si los dos supuestos anteriores son correctas, entonces esto es un enfoque para hacer eso:

#First let's summarise df2 by group 
df3 <- ddply(df2, .(grp), summarise, total = sum(val)) 
> df3 
    grp total 
1 A  5 
2 B  8 
3 C  3 

#Second, let's plot df3 as a line while treating the grp variable as numeric 

p <- ggplot(df, aes(x=grp, y=val)) 
p <- p + geom_bar(alpha=0.75, stat = "identity") 
p + geom_line(data=df3, aes(x=as.numeric(grp), y=total), colour = "red") 
+0

En realidad, estoy buscando una manera de trazar esencialmente a los gráficos de barras que contienen dos series diferentes, esconder una de las barras y en lugar de tener una línea (suave si es posible) ir a través de la parte superior de dónde habrían estado las barras de la serie oculta (similar a cómo se podría superponer un polinomio de frecuencia en un histograma). – user338714

+0

Aclaré la pregunta original. Gracias por su ayuda hasta el momento, parece que me falta un paso para resumir primero los datos. – user338714

+0

@ user338714 - respuesta actualizada, todavía estoy un poco confuso de lo que realmente está buscando aquí. Si lo que quieres no está arriba, ¿puedes encontrar un ejemplo de la imagen final que te gustaría tener? – Chase

17

Puede obtener totales de grupo de muchas maneras. Uno de ellos es

with(df, tapply(val, grp, sum)) 

Para simplificar, puede combinar datos de barras y líneas en un solo conjunto de datos.

df_all <- data.frame(grp = factor(levels(df$grp))) 
df_all$bar_heights <- with(df, tapply(val, grp, sum)) 
df_all$line_y <- with(df2, tapply(val, grp, sum)) 

Los gráficos de barras utilizan un eje x categórico. Para superponer una línea, necesitará convertir el eje en numérico.

ggplot(df_all) + 
    geom_bar(aes(x = grp, weight = bar_heights)) + 
    geom_line(aes(x = as.numeric(grp), y = line_y)) 

enter image description here

+0

¡Buena respuesta (+1)! Me gusta este enfoque. Supongo que depende de dónde provenga la fuente de datos original, lo que requerirá menos codificación. – Chase

Cuestiones relacionadas