【问题标题】:Connect means with a crossbar in ggplot2用ggplot2中的横杆连接意味着
【发布时间】:2021-10-03 14:31:03
【问题描述】:

我有一个看起来像这样的数据框

presence = rep(c("yes","no"),each=3,2)
students = sample(seq(0,100,by=10), 12, replace = TRUE)
year = rep(c("2015","2016"),each=2,6)

data = data.frame(presence, students, year)

我这样绘制我的数据

ggplot(data, aes(as.factor(presence), students, color=factor(year))) +
  geom_jitter(size=4, alpha=0.4, shape=16,position = position_jitterdodge()) +
  stat_summary(
    aes(color = year),
    fun=mean, 
    fun.min = function(x) mean(x) - sd(x), 
    fun.max = function(x) mean(x) + sd(x),
    geom = "pointrange",  size = 0.4,
    position = position_dodge(0.8)
  )  +
  stat_summary(fun = mean, geom="line")

我真正努力做的是找到一种方法将红色的点(平均值)和蓝色的点连接起来

除了 geom_segment 之外还有其他方法可以让我的情节看起来像这样吗?

【问题讨论】:

    标签: r ggplot2 dplyr tidyverse


    【解决方案1】:

    这是我的尝试:

    经验教训:永不放弃!

    set.seed(12345)
    
    presence = rep(c("yes","no"),each=3,2)
    students = sample(seq(0,100,by=10), 12, replace = TRUE)
    year = rep(c("2015","2016"),each=2,6)
    
    data = data.frame(presence, students, year)
    
    data1 <- data %>% 
        group_by(year, presence) %>% 
        mutate(mean = mean(students)) %>% 
        mutate(min = mean(students) - sd(students)) %>% 
        mutate(max = mean(students) + sd(students)) 
    
    
    ggplot(data1, aes(as.factor(presence), students, color=factor(year))) +  
        geom_bar(alpha=0, stat = "identity", position = "dodge", color="white") +
        geom_linerange(aes(ymin = min, ymax = max), position = position_dodge(width = 0.8)) +
        #geom_point(aes(y = mean), position = position_dodge(width = 0.8)) + 
        stat_summary(fun = mean, geom="point", color= "red", position = position_dodge(width = 0.8), aes(group=factor(year))) +
        stat_summary(fun = mean, geom="line", position = position_dodge(width = 0.8), aes(group=factor(year))) +
        geom_jitter(size=4, alpha=0.4, shape=16,position = position_jitterdodge()) +
        theme_classic() 
    
    

    【讨论】:

      【解决方案2】:

      我想你用geom="line"group = year 再做一次stat_summary(),虽然我认为从图表中读取有点困难:

      set.seed(12345)
      
      presence = rep(c("yes","no"),each=3,2)
      students = sample(seq(0,100,by=10), 12, replace = TRUE)
      year = rep(c("2015","2016"),each=2,6)
      
      data = data.frame(presence, students, year)
      
      g = ggplot(data, aes(as.factor(presence), students, color=factor(year))) +
        geom_jitter(size=4, alpha=0.4, shape=16,position = position_jitterdodge()) +
        stat_summary(
          aes(color = year),
          fun=mean, 
          fun.min = function(x) mean(x) - sd(x), 
          fun.max = function(x) mean(x) + sd(x),
          geom = "pointrange",  size = 0.4,
          position = position_dodge(0.8)
        )  +
        stat_summary(fun = mean, geom="line")
      
      g + stat_summary(aes(group = year),geom="line",
      position=position_dodge2(0.8),fun="mean")
      

      【讨论】:

      • 你让我的回答蒙羞!
      【解决方案3】:

      您可以使用geom_line,但这需要您自己添加data。但是,我不熟悉stat_summary,因为我更喜欢自己控制流程。

      • 所以我编辑了您的代码,看看是否可以复制它,并为您提供geom_segment 的替代方案。
      
      
      data %>% 
              ggplot(
                      mapping = aes(as.factor(presence), students, color=factor(year))
              )  + geom_line(
                      data = data %>% group_by(year, presence) %>% summarise(students = mean(students)),
                      mapping = aes(x = as.factor(presence), y = students,group = as.factor(year))
              )  + geom_point(
                      data = data %>% group_by(year, presence) %>% summarise(students = mean(students)),
                      mapping = aes(x = as.factor(presence), y = students,group = as.factor(year))
              ) + geom_jitter(size=4, alpha=0.4, shape=16,position = position_jitterdodge()) + geom_errorbar(
                      data = data %>% group_by(year, presence) %>% summarise( sd = sd(students), students = mean(students)),
                      aes(
                              ymin = students - sd,
                              ymax = students + sd
                      ),
                      width = 0.05
              )
      

      【讨论】:

        猜你喜欢
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 1970-01-01
        • 2019-04-26
        • 2020-08-30
        • 2012-07-08
        • 2016-12-11
        相关资源
        最近更新 更多