Совокупность/сумма с ggplot

Есть ли способ суммировать данные с помощью ggplot2?

Я хочу сделать карту пузырьков с размером в зависимости от суммы z.

В настоящее время я делаю что-то вроде

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

Но я чувствую, что дважды пишу одно и то же, я бы хотел написать что-то

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

Я посмотрел на stat_sum и stat_summmary, но я не уверен, что они тоже подходят.

Возможно ли это с ggplot2? Если нет, лучше всего написать эти две строки.

Ответ 1

Это можно сделать, используя stat_sum в ggplot2. По умолчанию размер точки представляет собой пропорции. Чтобы получить размер точки для представления счетчиков, используйте size = ..n.. как эстетический. Графы (и пропорции) третьей переменной могут быть получены путем взвешивания третьей переменной (weight = cost) как эстетической. Некоторые примеры, но сначала некоторые данные.

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

Данные содержат единицы, разделенные по двум факторам: X1 и X2; и третью переменную, которая является стоимостью каждой единицы.

Участок 1: отображает пропорцию элементов в каждой комбинации X1 - X2. group=1 сообщает ggplot рассчитать пропорции из общего числа единиц в кадре данных.

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

enter image description here

Участок 2: отображает число элементов в каждой комбинации X1 - X2.

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

enter image description here

Участок 3: вычисляет стоимость элементов в каждой комбинации X1 - X2, т.е. weight третьей переменной.

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

enter image description here

Сюжет 4: отображает долю общей стоимости всех элементов в кадре данных при каждой комбинации X1 - X2

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

enter image description here

Сюжет 5: Соотношение площадей, но вместо того, чтобы доля была вне общей стоимости для всех элементов в кадре данных, эта доля не входит в стоимость элементов в каждой категории X1. То есть, в каждой категории X1, где происходят основные затраты на устройства X2?

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

enter image description here

Ответ 2

Вы можете поместить вызов ddply в 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)

Или используйте пакет data.table.

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