【问题标题】:R - Multiple data points in forest plot using ggplot2R - 使用 ggplot2 在森林图中的多个数据点
【发布时间】:2015-08-26 18:53:10
【问题描述】:

示例数据:

df <- data.frame(Mean1=c(12,15,17,14,16,18,16,14),Lower1=c(8,11,13,7,15,12,12,11),Upper1=c(16,18,21,21,17,24,20,17),Mean2=c(13,16,18,15,17,19,17,15),Lower2=c(9,12,14,8,16,13,13,12),Upper2=c(17,19,22,22,18,25,21,18))
rownames(df) <- c(1,2,3,4,5,6,7,8)

我可以用Mean1 Lower1Upper1df 生成森林图:

ggplot(df, aes(y = row.names(df), x = df$Mean1)) +
     geom_point(size = 4) +
     geom_errorbarh(aes(xmax = df$Upper1, xmin = df$Lower1))

所以我的问题是:如何将 df 中的 Mean2 Lower2Upper2 包含到绘图中,以便每个观察点(行)的两个均值与各自的误差条成对表示?所以输出将是一个类似的森林图,但每个观察点的均值和误差限制都成对显示。我希望这是有道理的。

我什么都没试过,因为我根本不知道从哪里开始。

我可以在不破坏数据框结构的情况下执行此操作吗?

【问题讨论】:

  • 最简单的解决方案是将数据框重塑为长格式,以便每个误差条都有一行,其中包含下限、上限、估计值和分组变量。为什么需要完整的结构?

标签: r ggplot2


【解决方案1】:

最自然的方法是使用position 参数,但它需要与变量分组的值,而不是列名。您可以就地添加它:

ggplot(df,aes(x= rep(rownames(df), 2),
       y= c(Mean1,Mean2),
       group=rep(c(1,2), each=nrow(df)))) +
geom_point(position=position_dodge(1))+coord_flip()

但更正确的做法是打乱数据框的结构,这样会让代码更干净:

ggplot(df, aes(x = rownames, 
           y = Mean, 
           group=groups)) +
geom_point(size = 4, position=position_dodge(1))+
geom_errorbar(aes(ymax = Upper, ymin = Lower), position=position_dodge(1))+
coord_flip()

对于这个例子,我做了这个 data.frame 转换:

df <- data.frame(Mean=c(df$Mean1,df$Mean2),
                 Lower=c(df$Lower1,df$Lower2),
                 Upper=c(df$Upper1,df$Upper2),
                 groups=factor(rep(c(1,2), each=nrow(df))),
                 rownames=as.character(rep(rownames(df), 2)))

【讨论】:

    【解决方案2】:

    我不知道如何在不破坏数据框结构的情况下做到这一点,但由于您的数据框不是整齐的数据,我建议无论如何都要更改它。然后我得到以下内容可能会回答您的问题:

    library(tidyr)
    df$itemid <- rownames(df)
    df <- gather(df, type, value, -itemid)
    df <- separate(df, type, into=c("type", "grpid"), sep=-2)
    df <- spread(df, type, value)
    

    在单独的步骤中完成,因此更容易逐步执行以查看正在发生的事情。然后你可以使用:

    library(ggplot2)
    ggplot(df, aes(y = paste(itemid, grpid), x = df$Mean, color = grpid)) +
         geom_point(size = 4) +
         geom_errorbarh(aes(xmax = df$Upper, xmin = df$Lower))
    

    【讨论】:

      【解决方案3】:

      我不确定你的意思,但你想在森林图的顶部绘制 Mean2 值吗?在这种情况下,您可以为第一个绘图分配一个值,比如说 s1,然后像这样将新数据添加到它(可能添加差异颜色):

      s1<-ggplot(df, aes(y = row.names(df), x = df$Mean1)) +
           geom_point(size = 4) +
           geom_errorbarh(aes(xmax = df$Upper1, xmin = df$Lower1))
      
      s1 + geom_point(data=df, aes(y = row.names(df), x = df$Mean2)) + 
        geom_errorbarh(aes(xmax = df$Upper2, xmin = df$Lower2))
      

      否则,您可以重组数据,然后添加 facet_grid(. ~ Sample) 为您的样本制作单独的图表(Mean1 和 Mean2)

      【讨论】:

      • 谢谢。这是我一直在寻找的想法。您知道是否可以显示这些值,以便每对中的项目在彼此下方排列?
      • 您可以在第二部分的 aes 中使用y = as.numeric(row.names(df))-0.2。但是重复我自己,为什么你需要完整的数据框结构?这不是最佳实践。
      • 对于 R,我真的很缺乏经验。我得到的数据与示例相同,我最初认为我可以继续进行,而无需进一步篡改。我现在明白重塑它是明智之举,这样我就不用再使用奇怪的数据框了。
      • 祝你好运!我保证,练习会变得更容易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      相关资源
      最近更新 更多