Разделение лесного участка с помощью ggplot2

Я пытаюсь сделать лесной участок в R, показывая результаты метаанализа. Однако я столкнулся с проблемами с помощью ggplot2. Я до сих пор не встречал аналогичных вопросов по stackoverflow и был бы очень благодарен за помощь.

Используемый мной код выглядит так (я немного изменил его, чтобы сделать его самосодержащим):

cohort <- letters[1:15]
population <- c(  runif(15, min=2000, max=50000)) #hit1$N
beta <-  c(  runif(15, min=-1, max=2))
lower95 <- c(runif(15, min=-1.5, max=0.5))
upper95 <- c(runif(15, min=1.5, max=2.5))
type <- c("CBCL","SDQ","CBCL","SDQ","CBCL","SDQ","CBCL")
data <- as.data.frame(cbind(cohort, population, beta ,lower95,upper95,type))


ggplot(data=data, aes(x=cohort, y=beta))+
  geom_errorbar(aes(ymin=lower95, ymax=upper95), width=.667) +
  geom_point(aes(size=population, fill=type), colour="black",shape=21)+
  geom_hline(yintercept=0, linetype="dashed")+
  scale_x_discrete(name="Cohort")+
  coord_flip()+
  scale_shape(solid=FALSE)+
  scale_fill_manual(values=c( "CBCL"="white", "SDQ"="black"))+
  labs(title="Forest Plot") +
  theme_bw()

И если вы запустите это, он должен выглядеть примерно так:

Rplot http://klaasjanouwens.nl/Rplot.png

Теперь у меня есть следующие проблемы:

  • Ось x не читается, потому что все значения перекрываются.
  • В легенде справа ( "население" ) отображаются все значения, но я хочу, чтобы она отображала только некоторые произвольные значения, такие как 5000, 10000 и 15000.
  • Сюжет должен иметь пунктирную линию при y = 0, но эта строка отображается в крайнем правом углу графика, что не может быть прав.
  • Я хотел бы добавить дополнительные столбцы текста справа от каждого столбца (чтобы отобразить дополнительную информацию для каждой конкретной когорты).
  • Любые изменения, чтобы сделать сюжет "красивее" всегда приветствуем.

Спасибо заранее!

Ответ 1

Это похоже на то, что вы имели в виду:

data$beta <- as.numeric(as.character(data$beta))
data$lower95 <- as.numeric(as.character(data$lower95))
data$upper95 <- as.numeric(as.character(data$upper95))
data$population <- as.numeric(as.character(data$population))

ggplot(data=data,aes(x=beta,y=cohort))+
  geom_point(aes(size=population,fill=type), colour="black",shape=21)+
  geom_errorbarh(aes(xmin=lower95,xmax=upper95),height=0.667)+
  geom_vline(xintercept=0,linetype="dashed")+
  scale_size_continuous(breaks=c(5000,10000,15000))+
  geom_text(aes(x=2.8,label=type),size=4)

Вам нужно будет поиграть с аргументами geom_text(...), чтобы получить ярлыки, расположенные так, как вы того захотите, и получить нужный размер.

Что касается создания сюжета красивее, я предпочитаю это:

ggplot(data=data,aes(x=beta,y=cohort))+
  geom_point(aes(size=population,color=type),shape=16)+
  geom_errorbarh(aes(xmin=lower95,xmax=upper95),height=0.0, colour="blue")+
  geom_vline(xintercept=0,linetype="dashed")+
  scale_size_continuous(breaks=c(5000,10000,15000))+
  geom_text(aes(x=2.8,label=type),size=4)