首页 文章

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

提问于
浏览
0

在我的理解中,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)

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

2 回答

  • 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
    
  • 0

    看起来 stat='sum' 只能与 y 美学一起工作,因此我们需要在转到 ggplot 之前聚合数据并应用统计数据 . 这是一个 dplyr 的工作示例 . (注意:Stack Overflow评论者不允许我编辑MAK77 's reply and accept it, that' s是我写新答案的唯一原因 . )

    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
    

相关问题