【问题标题】:How to add means to a ggplot + geom_point plot如何将手段添加到 ggplot + geom_point 图
【发布时间】:2018-09-07 07:51:52
【问题描述】:

我有 10 组数据点,我正在尝试为要显示在图上的每个组添加平均值(例如,通过不同的符号,例如大三角形或星形或类似的东西)。 这是一个可重现的示例

library(ggplot2)
library(reshape2)
set.seed(1234)

x <- matrix(rnorm(100),10,10)
varnames <- paste("var", seq(1,10))

df <- data.frame(x)
colnames(df) <- varnames
melt(df)

ggplot(data = melt(df)) + geom_point(mapping = aes(x = variable, y = value))
mymeans <- colMeans(df)

基本上我现在想将mymeans 中的值绘制在它们各自的变量位置,有人知道如何快速做到这一点吗?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    或者我们可以使用stat_summary

    ggplot(data = reshape2::melt(df), aes(x = variable, y = value)) + 
      geom_point() +
      stat_summary(
        geom = "point",
        fun.y = "mean",
        col = "black",
        size = 3,
        shape = 24,
        fill = "red"
      )
    


    可以在此处找到有关可能形状的概述:www.cookbook-r.com

    【讨论】:

      【解决方案2】:

      您可以将另一个geom_point 传递给另一个data.frame

      尝试以下方法:

      df_means <- melt(summarise_all(df, mean))
      ggplot(data = melt(df)) + 
          geom_point(mapping = aes(x = variable, y = value)) + 
          geom_point(data=df_means,  mapping=aes(x = variable, y = value), col="red")
      

      我知道你在找什么?


      顺便说一句,更紧凑/现代/整洁的方式是:

      library(tidyverse)
      set.seed(1234)
      
      df <- replicate(10, rnorm(10)) %>% as_data_frame() %>% gather()
      df_means <- df %>% group_by(key) %>% summarise(value=mean(value))
      
      ggplot(data = df) + 
         aes(x = key, y = value) +
         geom_point() + 
         geom_point(data=df_means, col="red")
      

      【讨论】:

        【解决方案3】:

        更新了代码以反映 tidyverse 与以前的 cmets 相比的变化。

        由于 tidyverse 已更新其语法,以下是 dplyrggplot2 的更新版本。谢谢@Vincent Bonhomme 和@markus。

        为了重现性,我将复制他们的示例。

        library(tidyverse)
        
        # Dataset Generation
        set.seed(1234)
        df <- replicate(10, rnorm(10)) %>%
          as_data_frame() %>%
          pivot_longer(cols = everything(), names_to = "variable", values_to = "value") %>% # ** Change here   
          mutate(group = as.factor(rep(1:5, 20)))
        
        #Option 1: Use stat_summary() for a cleaner version (@Vincent Bonhomme)
        ggplot(df,  aes(x = variable, y = value)) + 
          geom_point() +
          stat_summary(
            fun = "mean",        #argument updated in new version.
            geom = "point",
            col = "black",
            size = 3,
            shape = 24,
            fill = "red"
          ) + 
        ggtitle("Example")
        
        
        #Option 2 -- Creating a means dataset (@ markus)
        df_means <- df %>% group_by(variable) %>% summarise(value=mean(value))
        ggplot(data = df) + 
          aes(x = variable, y = value) +
          geom_point() + 
          geom_point(data=df_means, 
        col="red",  
        size = 3,
            shape = 24,
            fill = "red") +
          ggtitle("Example")
        

        两者都创建相同的图表

        这里是使用的版本

        dplyr       * 1.0.3 
        ggplot2     * 3.3.3 
        

        【讨论】:

        • 这很好,只是你把用户弄糊涂了:D
        【解决方案4】:

        我发现将所有数据放在一起通常更简洁,而不是使用两个不同的框架。

        library(ggplot2)
        library(tidyr)
        library(dplyr)
        
        set.seed(1234)
        
        x <- matrix(rnorm(100),10,10)
        varnames <- paste("var", seq(1,10))
        
        df <- data.frame(x)
        colnames(df) <- varnames
        
        melt_data = df %>% gather
        mymeans = melt_data %>% group_by(key) %>% summarize(value = mean(value))
        mymeans$type = 'mean'
        melt_data$type = 'points'
        
        ggplot(data = bind_rows(melt_data, mymeans)) +
          geom_point(mapping = aes(x = key, y = value, color=type))
        

        【讨论】:

        • 1) 我发现将数据与其自己的聚合数据合并的建议非常危险。 2)这个答案实际上完全复制了用户Vincent Bonhommes的答案stackoverflow.com/a/52217979/7941188,只是添加了更多的代码行。
        • @tjebo: 1) 为什么?您应该知道生成的 data.frame 仅用于绘图并了解它包含的内容。记住这样的事情在编程中是非常基本的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多