如何在ggplot2森林图中添加聚类水平线?

5

我即将完成一份摘要森林图。以下是代码和绘图的图片。最后一个美好的步骤是将某些线条聚集在一起。例如,第1至4年的柱状图应该被聚集在一起,并与“总计”和“男性”之间留出空间。基本上,所有相同颜色的柱状图都应该聚集在一起,并与其他柱状图分开。我已经为此苦苦挣扎了几个小时。有什么想法吗?下面的代码包括我编造数据以创建此示例图。

library(ggplot2)

#MADE UP DATA
test <- data.frame(
x = c("one", "two", "three","four", "five", "six","seven", "eight", "nine","ten",     "eleven", "twelve","thirteen", "fourteen"),
y   = c(4.0, 4.4, 7.1, 8.2, 2.9, 3.0, 4.0,  9.0, 11.0,  7.6, 4.4, 4.6, 4.9, 5.0 ),
yhi = c(6.0, 4.8, 7.6, 8.4, 3.3, 3.1, 4.8, 10.0, 16.0, 8.0, 4.5, 5.0, 6.9, 5.7), 
ylo = c(2.0, 4.2, 6.6, 8.0, 2.5, 2.9, 3.2,  8.0,  6.0, 7.2, 4.3, 4.2, 2.9, 4.3), 
labpos = c(17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17), 
lab = c("total","Year1","Year2","Year3","Year4","Male","Female","Infant","Child","Adult","Urban","Rural","Occupational","Non-Occupational"), 
grouping = factor(c(1,2,2,2,2,3,3,4,4,4,5,5,6,6)))


test$x <- reorder(test$x, c(14,13,12,11,10,9,8,7,6,5,4,3,2,1))



# MAKE INITIAL PLOT
a <- ggplot(test, aes(x=x, y=y, ymin=ylo, ymax=yhi, colour=grouping)) +  geom_pointrange(shape=15, size=1.2, position=position_dodge(width=c(0.1))) + coord_flip() + geom_hline(aes(x=0), lty=2) + xlab('Variable') + scale_x_discrete(breaks=NULL) + scale_y_continuous(limits = c(-1,26)) + theme_bw() 


# ADD AXIS LABELS3
a <- a + ylab("Blood lead level (ug/dL)") + xlab("") + ggtitle("Meta-Analysis Summary") + theme(legend.position="none")

# ADD LABELS FOR EACH POINT/CI
a + geom_text(data=test, aes(x = x, y = labpos, label = lab, hjust=0, fontface="italic")) 

非常感谢。 我生成的图表...

facet_grid(grouping ~ .) 怎么样? - pangia
所以我尝试了facet_grid(根据您的建议),不幸的是它将六个组/颜色中的每一个都放入单独的图中。有没有办法在同一张图中进行“分面”?我知道这可能听起来很愚蠢。 - Slyron
这篇文章可能有助于关于分组的问题- http://chetvericov.ru/analiz-dannyx/grouped-forest-plots-using-ggplot2/#.U1PUjY-RDac] 在页面的中间部分。 - user20650
啊哈..我明白你的意思了。我会试一下,谢谢。 - Slyron
它有效了!我将用这个解决方案回答自己的帖子。谢谢。 - Slyron
@Slyron;很好的东西 - 接受自己的答案是可以的。 - user20650
1个回答

3

根据用户20650的建议,我已经明白了。

您需要添加缺失数据的行,以便在组之间留出空间。例如,用我的虚构数据集:

test3 <- data.frame(
x = c("one", "two", "three","four", "five", "six","seven", "eight", "nine","ten", "eleven", "twelve","thirteen", "fourteen", "fifteen"),
y   = c(4.0, NA, 4.4, 7.1, 8.2, 2.9, 3.0, 4.0,  9.0, 11.0,  7.6, 4.4, 4.6, 4.9, 5.0 ),
yhi = c(6.0, NA,  4.8, 7.6, 8.4, 3.3, 3.1, 4.8, 10.0, 16.0,  8.0, 4.5, 5.0, 6.9, 5.7), 
ylo = c(2.0, NA, 4.2, 6.6, 8.0, 2.5, 2.9, 3.2,  8.0,  6.0,  7.2, 4.3, 4.2, 2.9, 4.3), 
labpos = c(17, NA, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17), 
lab = c("total", "",   "Year1","Year2","Year3","Year4","Male","Female","Infant","Child","Adult","Urban","Rural","Occupational","Non-Occupational"), 
grouping = factor(c(1,1,2,2,2,2,3,3,4,4,4,5,5,6,6)))

test3$x <- reorder(test3$x, c(15,14,13,12,11,10,9,8,7,6,5,4,3,2,1))

这是一篇很棒的文章,谢谢你分享解决方案。我正在使用你的代码尝试制作一个图表,但我想要不同的颜色。我已经尝试了scale_fill_manual代码,但对我来说它不起作用。你知道任何文章、网站或信息可以教我如何做到这一点吗?谢谢! :) - user2363642
回答不错,但是那个链接已经失效了(至少我认为应该是这样的)。 - Stedy
哈哈,谢谢你指出来。让我立刻删除 @Stedy - Slyron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接