使用 ggplot2 线绘制平均值?

Posted

技术标签:

【中文标题】使用 ggplot2 线绘制平均值?【英文标题】:Plotting mean values using ggplot2 line? 【发布时间】:2021-08-28 02:11:50 【问题描述】:

从共享的数据集可以看出,$C1 的平均值对于因子“Geminate in $Consonant”比“Singleton”长。

我想在 x 轴上绘制 $Place,在 y 轴上绘制因子列 $Consonant 的 $C1 中的平均值。

Consonant     Place       C1 C1_xsampa
1  Singleton  Bilabial 149.8670        tS
2   Geminate  Bilabial 161.3066        tS
3  Singleton Retroflex 115.9713         f
4   Geminate Retroflex 143.3766         f
5  Singleton    Dental 130.1839         k
6  Singleton    Dental 118.7762         k
7   Geminate    Dental 122.1802         k
8  Singleton     Velar 112.3296         s
9   Geminate     Velar 142.4654         s
10 Singleton  Bilabial 245.7727        tS
11  Geminate  Bilabial 288.2960        tS
12  Geminate Retroflex 128.9104         f
13 Singleton    Dental 103.7978         k
14  Geminate    Dental 135.6264         k
15 Singleton    Dental 208.1685         k

为了方便您,我附上了一张展示类似情节的图片。我花了几天时间弄清楚这一点。任何想法都会非常有帮助。

############################EDIT################## #####

Place C2_xsampa Consonant  C1
1      Velar         k Singleton 127
2      Velar        k:  Geminate 122
3   Bilabial         p Singleton 129
4   Bilabial        p:  Geminate 171
5     Dental       t_d Singleton 150
6     Dental      t_d:  Geminate 172
7     Dental     t_d_h Singleton 121
8     Dental    t_d_h:  Geminate 123
9  Retroflex        t` Singleton 109
10 Retroflex       t`:  Geminate 116

【问题讨论】:

【参考方案1】:

目前尚不清楚您的预期输出是什么,但也许此解决方案适合您的用例:

library(tidyverse)
# summarySE func from
# http://www.cookbook-r.com/Graphs/Plotting_means_and_error_bars_(ggplot2)/#Helper%20functions
## Gives count, mean, standard deviation, standard error of the mean, and confidence interval (default 95%).
##   data: a data frame.
##   measurevar: the name of a column that contains the variable to be summariezed
##   groupvars: a vector containing names of columns that contain grouping variables
##   na.rm: a boolean that indicates whether to ignore NA's
##   conf.interval: the percent range of the confidence interval (default is 95%)

summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                      conf.interval=.95, .drop=TRUE) 
  library(plyr)
  # New version of length which can handle NA's: if na.rm==T, don't count them
  length2 <- function (x, na.rm=FALSE) 
    if (na.rm) sum(!is.na(x))
    else       length(x)
  
  
  # This does the summary. For each group's data frame, return a vector with
  # N, mean, and sd
  datac <- ddply(data, groupvars, .drop=.drop,
                 .fun = function(xx, col) 
                   c(N    = length2(xx[[col]], na.rm=na.rm),
                     mean = mean   (xx[[col]], na.rm=na.rm),
                     sd   = sd     (xx[[col]], na.rm=na.rm)
                   )
                 ,
                 measurevar
  )
  
  # Rename the "mean" column    
  datac <- rename(datac, c("mean" = measurevar))
  
  datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean
  
  # Confidence interval multiplier for standard error
  # Calculate t-statistic for confidence interval: 
  # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
  ciMult <- qt(conf.interval/2 + .5, datac$N-1)
  datac$ci <- datac$se * ciMult
  return(datac)


dat1 <- read.table(text = "rownumber Consonant     Place       C1 C1_xsampa
1  Singleton  Bilabial 149.8670        tS
2   Geminate  Bilabial 161.3066        tS
3  Singleton Retroflex 115.9713         f
4   Geminate Retroflex 143.3766         f
5  Singleton    Dental 130.1839         k
6  Singleton    Dental 118.7762         k
7   Geminate    Dental 122.1802         k
8  Singleton     Velar 112.3296         s
9   Geminate     Velar 142.4654         s
10 Singleton  Bilabial 245.7727        tS
11  Geminate  Bilabial 288.2960        tS
12  Geminate Retroflex 128.9104         f
13 Singleton    Dental 103.7978         k
14  Geminate    Dental 135.6264         k
15 Singleton    Dental 208.1685         k",
                   header = TRUE)

tgc <- summarySE(dat1, measurevar = "C1", groupvars = c("Consonant", "Place"))

ggplot(tgc, aes(x=Place, y=C1,
                colour=Consonant,
                group = Consonant)) + 
  geom_errorbar(aes(ymin=C1-se,
                    ymax=C1+se),
                width = 0.2,
                position = position_dodge(width = 0.2)) +
  geom_line(position = position_dodge(width = 0.2)) +
  geom_point(position = position_dodge(width = 0.2))

【讨论】:

【参考方案2】:

在将数据提供给 ggplot 之前,应该计算均值。 dplyr 包中的 group_by() 和 summarise() 以及 magrittr 包中的管道运算符 %>% 将顺利完成此操作。

如果上面的数据存储在对象“data”中,那么

    library(dplyr)
    library(magrittr)
    library(ggplot2)

    avg_data <- data %>% group_by(Consonant, Place) %>%
        summarise(mean_C1 = mean(C1))

    ggplot(avg_data, aes(Place, mean_C1, color = Consonant)) +
        geom_point()

应该提供您要查找的内容:Means of C1 per consonant and place。

【讨论】:

感谢您的建议。我能听懂你说的。但是,正如问题中提到的,这并没有为我提供所需的输出。我通过发布平均值来编辑问题。请查看发布的示例情节图片。 您应该在原始问题中清楚地指出哪些方面预计会出现在输出中。确切的形状或颜色是否有意义,点(或形状)下方和上方的线应代表哪些值? 感谢您的关注。可以看出,Singleton 和 Geminate 因子之间的数值 C2 差异不是很大。以这种方式考虑:而不是提供的图像中的两个因素(有声 - 无声),我希望输出描述 $Place 中列出的所有四个因素,用于 x 轴上的 Singleton 和 Geminate,以及它们的 C2 值在 y 轴上.我希望以这种方式输出,以便在 $Place 中的所有四个因素上显示 Singleton 和 Geminate 之间的非显着差异。我希望这就足够了。 添加:多个地块我也可以。

以上是关于使用 ggplot2 线绘制平均值?的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用ggplot2包使用geom_density()函数绘制分组密度图(线条色彩添加均值线)实战(density plot)

R语言使用ggplot2包使用geom_density()函数绘制分组密度图(填充色配置半透明填充色添加均值线)实战(density plot)

如何在R中的ggplot2中绘制组均值的平均值?

重复测量图:叠加平均轨迹和误差线 (ggplot2)

ggplot2将滚动平均值的标准差添加到散点图

ggplot2 并排绘制变量的均值和标准差