2012-06-27 1 views
10

Esiste un modo per sommare i dati con ggplot2?aggregato/somma con ggplot

Voglio fare una mappa di bolle con le dimensioni dipendenti dalla somma di z.

Attualmente sto facendo qualcosa di simile

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

Ma io sento che sto scrivendo la stessa cosa due volte, mi piacerebbe essere in grado di scrivere qualcosa

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

Ho dato un'occhiata a stat_sum e stat_summmary ma non sono sicuro che siano appropriati neanche.

E 'possibile con ggplot2? In caso contrario, quale sarebbe il modo migliore per scrivere quelle 2 righe.

risposta

6

Può essere eseguito utilizzando stat_sum all'interno di ggplot2. Per impostazione predefinita, la dimensione del punto rappresenta le proporzioni. Per ottenere la dimensione dei punti per rappresentare i conteggi, utilizzare size = ..n.. come estetica. I conteggi (e le proporzioni) di una terza variabile possono essere ottenuti ponderando la terza variabile (weight = cost) come estetica. Alcuni esempi, ma prima alcuni dati.

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 

I dati contengono unità categorizzate in base a due fattori: X1 e X2; e una terza variabile che è il costo di ogni unità.

Diagramma 1: Traccia la proporzione di elementi a ciascuna combinazione X1 - X2. group=1 indica a ggplot di calcolare le proporzioni rispetto al numero totale di unità nel riquadro dati.

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

enter image description here

Plot 2: Parcelle il numero di di elementi ad ogni X1 - X2 combinazione.

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

enter image description here

trama 3: Piazzole il costo degli elementi in ogni X1 - X2 combinazione, che è weight dalla terza variabile.

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

enter image description here

Plot 4: Piazzole la proporzione del costo totale di tutti gli elementi del frame di dati per ogni X1 - combinazione X2

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

enter image description here

Trama 5: Proporziona le proporzioni, ma invece che la proporzione è al di fuori del costo totale tra tutti gli elementi nel frame di dati, la proporzione è fuori dal costo per ements all'interno di ogni categoria di X1. Cioè, all'interno di ogni categoria X1, dove si verifica il costo maggiore per le unità X2?

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

enter image description here

+0

La risposta alla mia domanda è la trama n. 3? – mb14

+0

Scusa, avrei dovuto dirlo. Sì. –

2

si potrebbe mettere la chiamata ddply nella qplot:

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) 

Oppure utilizzare il pacchetto data.table.

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

so che posso farlo, le vostre soluzioni sono equivalenti al mio primo tentativo. Voglio evitare di dover specificare "x, y" due volte (nelle stesse linee o in 2 linee diverse) – mb14