Лесной участок с подгруппами в GGPlot2 - PullRequest
1 голос
/ 01 ноября 2019

Как абсолютный новичок в R (нет опыта программирования), у меня есть следующая проблема. Я пытаюсь создать сгруппированный лесной участок отношения шансов (blobbogram). Горизонтальная ось должна содержать ИЛИ. По вертикальной оси переменные. Каждая переменная содержит OR (включая нижний и верхний предел) для группы A и группы B. Таким образом, для каждой переменной, показанной на вертикальной оси, должны быть видны 2 строки. Этот веб-сайт и веб-сайт должны дать вам представление о группировке.

Я нашел довольно хороший формат для лесных участков из Майк Барнкоб , который я пытался приспособить к своим потребностям.

Я копался в стеке потока (например, здесь ). С помощью этого метода мне нужно разделить фрейм данных, я полагаю, что возможны и альтернативные способы.

Ниже приведен код, с некоторым фиктивным фреймом данных только для одной группы.

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="*")

Кто-нибудь знает, как добавить вторую группу для каждой переменной, в идеале с легендой выше или в стороне? Заранее спасибо!

1 Ответ

1 голос
/ 01 ноября 2019

Хитрость заключается в том, чтобы объединить их в один фрейм данных и ввести другую переменную, «группу» в моем примере ниже. Когда вы создаете график, вам нужно указать postion = 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()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...