【问题标题】:Plotting means with facet_grid in ggplot在 ggplot 中使用 facet_grid 绘制手段
【发布时间】:2020-05-17 09:06:46
【问题描述】:

假设我有以下data.frame

values<-runif(72)
factorA<-rep(c(rep('a',9),rep('b',9)),2)
criterion<-rep(rep(c(rep('1/4',3),rep('1/2',3),rep('2/3',3)),4),2)
case<-rep(c(rep('1',18),rep('2',18)),2)
samp<-rep(c('10','20','30'),24)
datasets<-c(rep('1',36),rep('2',36))
df<-data.frame(values,factorA,criterion,case,samp,datasets)

我想使用ggplot 绘制两个datasets 之间的values 的均值。如果我只考虑子集datasets='1',我想构建以下情节

library(ggplot2)
library(directlabels)
ggplot(subset(df,datasets %in% '1'),aes(x=samp,y=values,group=criterion))+
     geom_line(aes(linetype = criterion),size=1)+
     facet_grid(case~factorA,scales='free',space='free')+
     geom_dl(aes(label = criterion),method=list(dl.combine('first.qp','last.qp')))

产生

values 是随机获取的。

我想准确地获得这个图,但每条线代表两个datasets 之间的均值轨迹,对应的值。例如('a','1')面板中,criterion='1/4'和横坐标samp='10'线上的点必须是datasets1和2对应值的均值; criterion='1/4' 和横坐标 samp='20' 线上的点必须是 datasets 1 和 2 对应值的平均值,以此类推,对于每个面板。我怎样才能做到这一点?我尝试了stat_summary(),但没有成功...

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我认为您可以使用 dplyr 的 group_by 并汇总来完成您描述的内容。 1)按除数据框列之外的所有变量对df进行分组 和 2)计算每组的值列的平均值:

    library(tidyverse)
    library(directlabels)
    set.seed(1)
    values<-runif(72)
    factorA<-rep(c(rep('a',9),rep('b',9)),2)
    criterion<-rep(rep(c(rep('1/4',3),rep('1/2',3),rep('2/3',3)),4),2)
    case<-rep(c(rep('1',18),rep('2',18)),2)
    samp<-rep(c('10','20','30'),24)
    datasets<-c(rep('1',36),rep('2',36))
    df<-data.frame(values,factorA,criterion,case,samp,datasets)
    
    #calculate means of the value columns by group
    df_means <- df %>% 
      group_by(case, factorA, samp, criterion) %>% 
      summarize(mean_value = mean(values))
    
    ggplot(df_means,aes(x=samp,y=mean_value,group=criterion))+
      geom_line(aes(linetype = criterion),size=1)+
      facet_grid(case~factorA,scales='free',space='free')+
      geom_dl(aes(label = criterion),method=list(dl.combine('first.qp','last.qp')))
    

    检查所需的输出是否正确:

    > df %>% 
    + filter(criterion == '1/4', factorA == 'a', samp == '10', case == '1')
         values factorA criterion case samp datasets
    1 0.2655087       a       1/4    1   10        1
    2 0.7942399       a       1/4    1   10        2
    > mean(c(0.2655087, 0.7942399))
    [1] 0.5298743
    > df_means %>% 
    +   filter(criterion == '1/4', factorA == 'a', samp == '10', case == '1')
    # A tibble: 1 x 5
    # Groups:   case, factorA, samp [1]
      case  factorA samp  criterion mean_value
      <chr> <chr>   <chr> <chr>          <dbl>
    1 1     a       10    1/4            0.530
    

    【讨论】:

    • 是的,我也在探索这个解决方案,因为它看起来更容易:首先计算所需案例的均值,然后进行绘图。谢谢你的帮助!!
    • 感谢您的更新 ;-) 我正在检查输出是否正确 ;-)
    • 仔细检查没有坏处
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多