2012-06-27 21 views
10

Gibt es eine Möglichkeit, Daten mit ggplot2 zu summieren?Aggregat/Summe mit ggplot

Ich möchte eine Blase Karte mit der Größe abhängig von der Summe von z machen.

Zur Zeit mache ich so etwas wie

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

Aber ich glaube, ich bin die gleiche Sache zweimal zu schreiben, würde Ich mag, um etwas

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

Ich hatte einen Blick schreiben bei stat_sum und stat_summmary, aber ich bin mir nicht sicher, ob sie auch geeignet sind.

Ist es möglich mit ggplot2? Wenn nicht, was wäre der beste Weg, diese 2 Zeilen zu schreiben.

Antwort

6

Es kann mit stat_sum innerhalb ggplot2 erfolgen. Standardmäßig stellt die Punktgröße Proportionen dar. Verwenden Sie size = ..n.. als ästhetisch, um Punktgröße zu erhalten, um Zahlen zu vertreten. Zählungen (und Proportionen) durch eine dritte Variable können durch Gewichtung mit der dritten Variablen (weight = cost) als ästhetisch erhalten werden. Einige Beispiele, aber zuerst einige Daten.

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 

Die Daten enthalten Einheiten, die nach zwei Faktoren kategorisiert sind: X1 und X2; und eine dritte Variable, die die Kosten jeder Einheit ist.

Plot 1: Zeichnet die Proportion der Elemente bei jeder X1 - X2 Kombination. group=1 teilt ggplot mit, die Proportionen aus der Gesamtzahl der Einheiten im Datenrahmen zu berechnen.

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

enter image description here

Plot 2: Plots der Anzahl von Elementen an jedem X1 - X2 Kombination.

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

enter image description here

Plot 3: Plots die Kosten der Elemente an jeder X1 - X2-Kombination, ist, dass weight durch die dritte Variable.

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

enter image description here

Plot 4: Plots der Anteil der Gesamtkosten aller Elemente in dem Datenrahmen an jeder X1 - X2 Kombination

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

enter image description here

Plot 5: Stellt Proportionen dar, aber anstatt dass der Anteil über alle Elemente im Datenrahmen von den Gesamtkosten abweicht, ist der Anteil der Kosten für el innerhalb jeder Kategorie von X1. Das heißt, innerhalb jeder X1-Kategorie, wo fallen die Hauptkosten für X2-Einheiten an?

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

enter image description here

+0

Ist die Antwort zu meinem Frageplot # 3 dann? – mb14

+0

Entschuldigung, ich hätte es so sagen sollen. Ja. –

2

Sie könnten den ddply Anruf in die qplot setzen:

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) 

Oder die data.table Paket verwenden.

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

Ich weiß, was ich tun kann, dass Ihre Lösungen zu meinem ersten Versuch gleichwertig sind. Ich möchte vermeiden, zweimal 'x, y' angeben zu müssen (in den gleichen Zeilen oder in 2 verschiedenen Zeilen) – mb14