2012-06-27 24 views
10

¿Hay alguna manera de sumar datos con ggplot2?agregado/suma con ggplot

Quiero hacer un mapa de burbujas con el tamaño que depende de la suma de z.

Actualmente estoy haciendo algo como

dd <- ddply(d, .(x,y), transform, z=sum(z)) 
qplot(x,y, data=dd, size=z) 

Pero siento que estoy escribiendo lo mismo dos veces, me gustaría ser capaz de escribir algo

qplot(x,y, data=dd, size=sum(z)) 

que tenía un aspecto en stat_sum y stat_summmary pero no estoy seguro de que sean apropiados tampoco.

¿Es posible con ggplot2? Si no, ¿cuál sería la mejor manera de escribir esas 2 líneas?

Respuesta

6

Se puede hacer usando stat_sum dentro de ggplot2. Por defecto, el tamaño del punto representa proporciones. Para obtener el tamaño de punto para representar conteos, use size = ..n.. como estética. Los recuentos (y las proporciones) por una tercera variable se pueden obtener ponderando por la tercera variable (weight = cost) como una estética. Algunos ejemplos, pero primero, algunos datos.

library(ggplot2) 
set.seed = 321 
# Generate somme data 
df <- expand.grid(x = seq(1:5), y = seq(1:5), KEEP.OUT.ATTRS = FALSE) 
df$Count = sample(1:25, 25, replace = F) 
library(plyr) 
new <- dlply(df, .(Count), function(data) matrix(rep(matrix(c(data$x, data$y), ncol = 2), data$Count), byrow = TRUE, ncol = 2)) 
df2 <- data.frame(do.call(rbind, new)) 
df2$cost <- 1:325 

Los datos contienen unidades clasificadas según dos factores: X1 y X2; y una tercera variable que es el costo de cada unidad.

Gráfico 1: Grafica la proporción de elementos en cada combinación X1 - X2. group=1 le dice a ggplot que calcule las proporciones del total de unidades en el marco de datos.

ggplot(df2, aes(factor(X1), factor(X2))) + 
    stat_sum(aes(group = 1)) 

enter image description here

Parcela 2: Parcelas la número de elementos en cada X1 - X2 combinación.

ggplot(df2, aes(factor(X1), factor(X2))) + 
    stat_sum(aes(size = ..n..)) 

enter image description here

Parcela 3: Parcelas el costo de los elementos en cada X1 - X2 combinación, que es weight por la tercera variable.

ggplot(df2, aes(x=factor(X1), y=factor(X2))) + 
    stat_sum(aes(group = 1, weight = cost, size = ..n..)) 

enter image description here

Parcela 4: Parcelas la proporción del coste total de todos los elementos en la trama de datos en cada X1 - combinación X2

ggplot(df2, aes(x=factor(X1), y=factor(X2))) + 
    stat_sum(aes(group = 1, weight = cost)) 

enter image description here

Parcela 5: Traza proporciones, pero en lugar de que la proporción esté fuera del costo total en todos los elementos en el marco de datos, la proporción está fuera del costo para el ementos dentro de cada categoría de X1. Es decir, dentro de cada categoría X1, ¿dónde ocurre el mayor costo para las unidades X2?

ggplot(df2, aes(x=factor(X1), y=factor(X2))) + 
    stat_sum(aes(group = X1, weight = cost)) 

enter image description here

+0

¿La respuesta a mi pregunta es la gráfica 3? – mb14

+0

Lo siento, debería haberlo dicho. Sí. –

2

se puede poner la llamada en el ddplyqplot:

d <- data.frame(x=1:10, y=1:10, z= runif(100)) 
qplot(x, y, data=ddply(d, .(x,y), transform, z=sum(z)), size=z) 

o utilizar el paquete data.table.

DT <- data.table(d, key='x,y') 
qplot(x, y, data=DT[, sum(z), by='x,y'], size=V1) 
+1

Yo sé que puedo hacer eso, sus soluciones son equivalentes a mi primer intento. Quiero evitar tener que especificar 'x, y' dos veces (en la misma línea o en 2 líneas diferentes) – mb14