如何将ggplot stat_sum映射到大小美学?

时间:2017-03-09 13:48:44

标签: r plot ggplot2

在我的理解中,ggplot的stat方法采用值数组并计算可以通过某些美学显示的新值。我希望点的大小与每个组中的数字变量之和成比例(唯一x, y组合)。我很惊讶,只要一组中有多个值,就会绘制多个点,而不是一个点代表所有的总和。这是一个最小的工作示例:

ex_data <- data.frame(
    a = sort(rep(letters[1:4], 5)),
    b = rep(letters[6:7], 10),
    c = rnorm(20, 1000, 500),
    d = rep(c('h', 'h', 'i', 'i'), 5)
)

p <- ggplot(ex_data,
    aes(x = b, y = a, size = log10(c), color = d, shape = d)) +
    geom_point(stat = 'sum', alpha = 0.33) +
    scale_radius(guide = guide_legend(title = 'c (log)')) +
    scale_color_manual(values = c('cyan', 'magenta'),
                    guide = guide_legend(title = 'd'),
                    labels = c('h', 'i')) +
    scale_shape_manual(values = c(15, 18), guide = FALSE) +
    theme_bw()

print(p)

由于低alpha,可以看到例如c-fa-f相同颜色的多个点相互绘制。如何在每个位置为每种颜色设置一个点,这些标记的大小代表该组中log10(c)个变量的所有值的总和?

2 个答案:

答案 0 :(得分:1)

我相信你需要以某种方式重塑数据。这是我的示例(使用data.tabledplyr

ex_data_2 <- data.table(ex_data) %>%
    .[, list(c = sum(c), 
             d = which.max(table(d))), by = list(a, b)] %>%
    .[, d := c('c', 'd')[d]]
p <- ggplot(ex_data_2,
            aes(x = b, y = a, size = log(c), color = d, shape = d)) +
    geom_point(stat = 'sum', alpha = 0.33) +
    scale_radius(guide = guide_legend(title = 'c (log)')) +
    scale_color_manual(values = c('cyan', 'magenta'),
                       guide = guide_legend(title = 'd'),
                       labels = c('h', 'i')) +
    scale_shape_manual(values = c(15, 18), guide = FALSE) + 
    theme_bw()
p

答案 1 :(得分:0)

看起来stat='sum'只能与y美学一起使用,因此我们需要在转到ggplot之前汇总数据并应用统计数据。以下是dplyr的工作示例。 (注意:Stack Overflow评论员不允许我编辑MAK77的回复并接受它,这是我写新答案的唯一原因。)

require(dplyr)
require(ggplot2)

ex_data <- data.frame(
    a = sort(rep(letters[1:4], 5)),
    b = rep(letters[6:7], 10),
    c = rnorm(20, 1000, 500),
    d = rep(c('h', 'h', 'i', 'i'), 5)
)

ex_data_2 <- ex_data %>%
        group_by(a, b, d) %>%
        mutate(csum = sum(c)) %>%
        summarise_all(first)

p <- ggplot(ex_data_2,
            aes(x = b, y = a, size = log(csum), color = d, shape = d)) +
    geom_point(alpha = 0.33) +
    scale_radius(guide = guide_legend(title = 'c (log)')) +
    scale_color_manual(values = c('cyan', 'magenta'),
                    guide = guide_legend(title = 'd'),
                    labels = c('h', 'i')) +
    scale_shape_manual(values = c(15, 18), guide = FALSE) + 
    theme_bw()
p