分享
为什么问答平台  ›  专栏  ›  技术社区  ›  Margaret

ggplot中每组的平均值 - Mean per group in ggplot

  •  0
  • Margaret  · 技术社区  · 4 天前

    我试图创建一个点图,它在一个方向上是离散的,在另一个方向上是连续的。然后我想显示每个离散值的平均值。

    这是我迄今为止最接近的:

    库(tibble)
    库(dplyr)
    库(字符串)
    图书馆(ggplot2)
    
    mtcars_品牌<-mtcars%>%
    取消分组()%>%
    行名称_到_列(“car”)%>%
    突变(品牌=字(car,1,1,sep=))%>%
    mutate(品牌=ifelse(品牌%in%c(‘fiat’、‘toyota’、‘hornet’、‘merc’),品牌‘zother’))%>%
    突变(品牌=重新订购(品牌、MPG、平均值)
    
    平均MPG<-mtcars_品牌为%gt;%
    分组依据(品牌)%>%
    突变(平均mpg=平均(mpg,na.rm=真))%>%
    取消分组()%>%
    选择(品牌,平均英里/加仑)%>%
    非重复()
    
    mtcars_品牌为%gt;%
    ggplot(aes(x=品牌,y=mpg))。+
    geom_col(数据=平均值,
    aes(x=品牌,
    y=平均值
    col=“黑色”,
    fill=“白色”)。+
    几何点(高度=0)+
    风水线(xintercept=seq(从=0.5到=5.5,x=1),colour='bbbbb')+
    坐标翻转()。+
    主题\经典版()
    

    但是我更喜欢Y值的单行线,而不是条形图给我的整个轮廓线。

    我觉得我试图用错误的风水来做这个,但我不确定我应该做什么。我已经研究过geom_linerange->code>和类似的内容,但如果它们适合这样做,我就无法确定如何操作。

    这是我迄今为止最接近的:

    library(tibble)
    library(dplyr)
    library(stringr)
    library(ggplot2)
    
    mtcars_with_brand <- mtcars %>%
      ungroup() %>%
      rownames_to_column("Car") %>%
      mutate(Brand = word(Car, 1,1, sep = " ")) %>%
      mutate(Brand = ifelse(Brand %in% c('Fiat','Toyota','Hornet', 'Merc'), Brand, 'zOther')) %>%
      mutate(Brand=reorder(Brand, mpg, mean))
    
    mean_mpg <- mtcars_with_brand %>%
      group_by(Brand) %>%
      mutate(mean_mpg = mean(mpg, na.rm = TRUE)) %>%
      ungroup() %>%
      select(Brand, mean_mpg) %>%
      distinct()
    
    mtcars_with_brand %>%
      ggplot(aes(x = Brand, y = mpg)) +
      geom_col(data = mean_mpg, 
               aes(x = Brand,
                   y = mean_mpg),
               col = "black",
               fill = "white") +
      geom_point(height = 0) +
      geom_vline(xintercept=seq(from=0.5, to=5.5, by=1), colour='#bbbbbb') +
      coord_flip() +
      theme_classic()
    

    enter image description here

    但是我更喜欢Y值的单行线,而不是条形图给我的整个轮廓线。

    我觉得我试图用错误的风水来做这个,但我不确定我应该做什么。我已经调查过了geom_linerange类似的,但如果他们适合这样做,我不知道怎么做。

    1 回复  |  直到 4 天前
        1
  •  1
  •   rg255    4 天前

    使用 geom_point 和衍生工具通过 group_by summarse 绘制。您似乎对样式元素有很好的了解,所以我将把它从这里去掉,这样解决方案就很清楚了:

    ggplot()。+
    #每辆车得分
    geom_point(data=mtcars_with_brand,mapping=aes(y=brand,x=mpg))。+
    #手段的竖条
    geom_point(data=mtcars_with_brand%>%
    #将数据按品牌分组,然后获取方法
    分组依据(品牌)%>%
    总结(mean_mpg=mean(mpg)),
    #指定美学
    映射=aes(y=品牌,x=平均值)
    尺寸=10,颜色=红色,形状=红色)
    

    关于造型元素,我将在这里不谈,所以解决方案是明确的:

    ggplot() +
      # Points for each car
      geom_point(data = mtcars_with_brand, mapping = aes(y = Brand, x = mpg)) +
      # Vertical bars for the means
      geom_point(data = mtcars_with_brand %>% 
          # Group the data by brand then get means
          group_by(Brand) %>% 
          summarise(mean_mpg = mean(mpg)), 
        # Specify aesthetics
        mapping = aes(y = Brand, x = mean_mpg), 
        size = 10, color = 'red', shape = '|') 
    

    enter image description here