【问题标题】:Combined bar plot and points in ggplot2ggplot2中的组合条形图和点
【发布时间】:2015-03-02 20:42:58
【问题描述】:

我想用点绘制一个“组合”条形图。 考虑以下虚拟数据:

library(ggplot2)
library(gridExtra)
library(dplyr)

se <- function(x){sd(x)/sqrt(length(x))}

p1 <- ggplot(mtcars, aes(y=disp, x=cyl, fill=cyl)) 
p1 <- p1 + geom_point() + theme_classic() + ylim(c(0,500))

my_dat <- summarise(group_by(mtcars, cyl), my_mean=mean(disp),my_se=se(disp))

p2 <- ggplot(my_dat, aes(y=my_mean,x=cyl,ymin=my_mean-my_se,ymax=my_mean+my_se))
p2 <- p2 + geom_bar(stat="identity",width=0.75) +     geom_errorbar(stat="identity",width=0.75) + theme_classic() + ylim(c(0,500))

最终的情节应该是这样的:

【问题讨论】:

    标签: r ggplot2 bar-chart


    【解决方案1】:

    您可以将图层添加在一起,但如果它们具有不同的数据和/或美学,您需要在每个图形图层中包含 dataaes 参数。

    p3 <- ggplot() +
        geom_bar(data=my_dat, aes(y=my_mean,x=cyl,ymin=my_mean-my_se,ymax=my_mean+my_se), stat="identity", width = 0.75) + 
        geom_errorbar(data=my_dat, aes(y=my_mean,x=cyl,ymin=my_mean-my_se,ymax=my_mean+my_se), width = 0.75) +
        geom_point(data=mtcars, aes(y=disp, x=cyl, fill=cyl)) +
        ylim(c(0,500)) +
        theme_classic()
    

    如果您想让点偏离条形的一侧,您可以从 cyl 值中减去偏移量以在点上移动。就像@LukeA 提到的那样,将 geom_point 更改为 geom_point(data=mtcars, aes(y=disp, x=cyl-.5, fill=cyl))

    【讨论】:

    • geom_point(data=mtcars, aes(y=disp, x=cyl-.5, fill=cyl)) 以获得所需的偏移量。
    【解决方案2】:

    您可以将每一层单独指定为ggplot2。通常您对每个几何图形使用相同的数据框和选项,因此在ggplot() 中设置默认值是有意义的。在您的情况下,您应该分别指定每个 geom:

    library(ggplot2)
    library(gridExtra)
    library(dplyr)
    
    se <- function(x){sd(x)/sqrt(length(x))}
    my_dat <- summarise(group_by(mtcars, cyl),
                        my_mean = mean(disp),
                        my_se = se(disp))
    p1 <- ggplot() + 
      geom_bar(data = my_dat,
               aes(y = my_mean, x = cyl,
                   ymin = my_mean - my_se,
                   ymax = my_mean + my_se), stat="identity", width=0.75) + 
      geom_errorbar(data = my_dat,
                    aes(y = my_mean, x = cyl,
                        ymin = my_mean - my_se,
                        ymax = my_mean + my_se), stat="identity", width=0.75) + 
      geom_point(data = mtcars, aes(y = disp, x = cyl, fill = cyl)) +
      theme_classic() + ylim(c(0,500))
    
    p1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-05
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多