1

作为 R 中的一个新手(没有任何编码经验),我有以下问题。我正在尝试创建优势比(blobbogram)的分组森林图。水平轴应包含 OR。纵轴是变量。每个变量都包含 A 组和 B 组的 OR(包括下限和上限)。因此,垂直轴上显示的每个变量应该有 2 条线可见。这个网站和这个网站应该给你一种分组的想法。

我从Mike Barnkob那里找到了一种很好的森林图格式,我一直在努力适应我的需要。

我一直在争先恐后地通过stackoverflow(例如here)。使用这种方法,我必须拆分数据框,我想其他方法也可能是可能的。

请在代码下方找到,其中仅包含一组虚拟数据框。

df <- data.frame(Outcome=c("Outcome A", "Outcome B", "Outcome C", "Outcome D"),
   OR=c(1.50, 2.60, 1.70, 1.30),
   Lower=c(1.00, 0.98, 0.60, 1.20),
   Upper=c(2.00, 3.01, 1.80, 2.20)
                      )
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')  

Outcome_order <- c('Outcome C', 'Outcome A', 'Outcome B', 'Outcome D')

p <- ggplot(df, aes(x=factor (Outcome, level=Outcome_order), y=OR, ymin=Lower, ymax=Upper)) + 
  geom_linerange(size=5, colour="#a6d8f0") +
  geom_hline(aes(x=0, yintercept=1), lty=2) +
  geom_point(size=3, shape=21, fill="#008fd5", colour="white", stroke = 0.5) +
  scale_x_discrete(name="(Post)operative outcomes") +
  scale_y_continuous(name="Odds ratio", limits = c(0.5, 5)) +
  coord_flip() +
  theme_minimal()
p

p + annotate("text", x=4.1, y=2.25, label="*")

有谁知道如何为每个变量添加第二组,最好在上面或旁边加上一个图例?先感谢您!

4

1 回答 1

4

诀窍是将它们组合成一个数据框,并在下面的示例中引入另一个变量“组”。绘制绘图时,您需要指定 position=position_dodge() 以便它们并排绘制。看看下面是不是你想要的。我对颜色真的很不好,所以你可能需要为其他组指定颜色

library('ggplot2') 

Outcome_order <- c('Outcome C', 'Outcome A', 'Outcome B', 'Outcome D')

#this is the first dataset you have
df1 <- data.frame(Outcome=c("Outcome A", "Outcome B", "Outcome C", "Outcome D"),
   OR=c(1.50, 2.60, 1.70, 1.30),
   Lower=c(1.00, 0.98, 0.60, 1.20),
   Upper=c(2.00, 3.01, 1.80, 2.20))
# add a group column
df1$group <- "X"
# create a second dataset, similar format to first
df2 <- df1
# different group
df2$group <- "Y"
# and we adjust the values a bit, so it will look different in the plot
df2[,c("OR","Lower","Upper")] <- df2[,c("OR","Lower","Upper")] +0.5

# combine the two datasets                      
df = rbind(df1,df2)
# you can do the factoring here
df$Outcome = factor (df$Outcome, level=Outcome_order)

#define colours for dots and bars
dotCOLS = c("#a6d8f0","#f9b282")
barCOLS = c("#008fd5","#de6b35")


p <- ggplot(df, aes(x=Outcome, y=OR, ymin=Lower, ymax=Upper,col=group,fill=group)) + 
#specify position here
  geom_linerange(size=5,position=position_dodge(width = 0.5)) +
  geom_hline(yintercept=1, lty=2) +
#specify position here too
  geom_point(size=3, shape=21, colour="white", stroke = 0.5,position=position_dodge(width = 0.5)) +
  scale_fill_manual(values=barCOLS)+
  scale_color_manual(values=dotCOLS)+
  scale_x_discrete(name="(Post)operative outcomes") +
  scale_y_continuous(name="Odds ratio", limits = c(0.5, 5)) +
  coord_flip() +
  theme_minimal()

在此处输入图像描述

于 2019-11-01T12:09:44.710 回答