【问题标题】:Mean per group on a bubble plot with ggplot使用 ggplot 的气泡图上的每组平均值
【发布时间】:2017-02-23 18:50:43
【问题描述】:

我有一个包含很多重叠点的数据集,并使用 ggplot 创建了一个气泡图来显示该数据。我需要在我的绘图上为 x 轴上每个组的平均值添加条形(值可以是 0、1 或 2)。我曾尝试使用 geom_errorbar 但无法让它与我的数据一起使用。任何帮助/建议将不胜感激。

以下是我的代码和生成类似假数据的脚本:

y <- seq(from=0, to=3.5, by=0.5)
x <- seq(from=0, to=2, by=1)
xnew <- sample(x, 100, replace=T)
ynew <- sample(y, 100, replace=T)
data <- data.frame(xnew,ynew)

data2 <- aggregate(data$xnew, by=list(x=data$xnew, y=data$ynew), length)
names(data2)[3] <- "Count"

ggplot(data2, aes(x = x, y = y)) + 
    geom_point(aes(size=Count)) + 
    labs(x = "Copies", y = "Score") + 
    aes(ymax=..y.., ymin=..y..) + 
    scale_x_continuous(breaks = seq(0, 2, 1)) + 
    scale_y_continuous(breaks = seq(0, 3, 0.5)) + 
    theme(legend.position = "bottom", legend.direction = "horizontal", 
    axis.line = element_line(size=1, colour = "black"), 
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), 
    panel.border = element_blank(), 
    panel.background = element_blank(), 
    axis.text.x = element_text(colour="black", size = 10), 
    axis.text.y = element_text(colour="black", size = 10))

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我不完全确定我是否正确理解了您的问题。在我看来,除了气泡之外,您还想将y 的每个值的平均值可视化为x 的某种条形。 (您提到了错误栏,但似乎这不是必需的,而只是您尝试过的。我将改用geom_col()。)

    我假设您想通过计数来衡量 y 的平均值,即 sum(y * Count) / sum(Count)。您可以使用dplyr 创建一个包含这些值的数据框:

    data2_mean
    ## # A tibble: 3 × 2
    ##       x        y
    ##   <dbl>    <dbl>
    ## 1     0 1.833333
    ## 2     1 1.750000
    ## 3     2 2.200000
    

    创建绘图时,我使用data2 作为geom_point() 的数据集和data2_mean 作为geom_col() 的数据集。重要的是先放置条形图,因为气泡应该位于条形图的顶部。

    ggplot() + 
        geom_col(aes(x = x, y = y), data2_mean, fill = "gray60", width = 0.7) + 
        geom_point(aes(x = x, y = y, size = Count), data2) + 
        labs(x = "Copies", y = "Score") + 
        scale_x_continuous(breaks = seq(0, 2, 1)) + 
        scale_y_continuous(breaks = seq(0, 3, 0.5)) + 
        theme(legend.position = "bottom", legend.direction = "horizontal", 
        axis.line = element_line(size=1, colour = "black"), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), 
        panel.border = element_blank(), 
        panel.background = element_blank(), 
        axis.text.x = element_text(colour="black", size = 10), 
        axis.text.y = element_text(colour="black", size = 10))
    

    与您的代码相比,我所做的所有更改都出现在 scale_x_continuous() 之前。这会产生以下情节:

    【讨论】:

    • 这不是我想要的。我需要一个更薄的酒吧。不过,谢谢您的意见。我很欣赏这个建议。
    【解决方案2】:

    这就是你所追求的吗?我首先使用dplyr 包计算了组级别的平均值,然后使用geom_segment 将线段添加到您的绘图中:

    library(ggplot2)
    library(dplyr)
    data2 <- data2 %>% group_by(x) %>% mutate(mean.y = mean(y))
    ggplot(data2, aes(x = x, y = y)) + 
    geom_point(aes(size=Count)) + 
    labs(x = "Copies", y = "Score") + 
    aes(ymax=..y.., ymin=..y..) + 
    scale_x_continuous(breaks = seq(0, 2, 1)) + 
    scale_y_continuous(breaks = seq(0, 3, 0.5)) + 
    theme(legend.position = "bottom", legend.direction = "horizontal", 
        axis.line = element_line(size=1, colour = "black"), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), 
        panel.border = element_blank(), 
        panel.background = element_blank(), 
        axis.text.x = element_text(colour="black", size = 10), 
        axis.text.y = element_text(colour="black", size = 10)) +
    geom_segment(aes(y = mean.y, yend = mean.y, x = x -0.25, xend = x + 0.25))
    

    【讨论】:

    • 这正是我想要做的。我只需要添加回创建计数对象的代码部分。谢谢!
    猜你喜欢
    • 2018-11-14
    • 2018-09-15
    • 2021-11-13
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多