我在使用ggplot2制作类似森林图的东西时,遇到了与上述相似的问题,但没有找到其他解决方案能够满足我的需求。上面的回答对我不起作用——表格没有显示出来。所以我想到了一个代码不太漂亮的解决方案,但实际上我很喜欢这种清晰的视觉输出。
我喜欢这个解决方案的几个方面:
- 我将一组自定义文本对齐在右侧的图形中,而不是放在表格中,其中每个文本条目和每个标签在图形中都有匹配的对齐方式。
- 我使用居中的 ggtitle 来对齐每组文本的“列标题”。这些可以是任何类型的字符串(在我实际使用中,我有点估计和置信区间)。
library(gridExtra)
library(ggplot2)
dat <- data.frame(
label = c("A", "B", "C"),
point_est = c(1,2,3),
lb_ci = c(.5, 1.5, 2.5),
ub_ci = c(1.5, 2.5, 3.5),
n = c(50, 100, 150),
total = c(75, 150, 200)
)
plot1 <- ggplot(dat, aes(x=point_est, y=label)) +
geom_point() +
geom_errorbarh(aes(xmin=lb_ci, xmax=ub_ci), height=.5) +
ggtitle("Some measure") +
ylab(NULL) + xlab("some effect estimate")
tab_base <- ggplot(dat, aes(y=label)) +
ylab(NULL) + xlab(" ") +
theme(plot.title = element_text(hjust = 0.5, size=12),
axis.text.x=element_text(color="white"),
axis.line=element_blank(),
axis.text.y=element_blank(),axis.ticks=element_blank(),
axis.title.y=element_blank(),legend.position="none",
panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),plot.background=element_blank())
tab1 <- tab_base +
geom_text(aes(x=1, label=n)) +
ggtitle("n")
tab2 <- tab_base +
geom_text(aes(x=1, label=total)) +
ggtitle("total")
lay <- matrix(c(1,1,1,1,1,1,2,3), nrow=1)
grid.arrange(plot1, tab1, tab2, layout_matrix = lay)