我正在使用or
创建效果大小(表示为X
)的森林图,其类型(Y
或ggplot2
)分面。
我希望每个方面的第一行是该方面的摘要效果大小(cite=='Summary'
),然后是每个研究的一行,按效果大小排序(我不特别在意它是否是上升或下降)。虽然我可以轻松地创建与此对应的数据框,但我似乎无法在两个方面按顺序绘制,而不会对摘要效果大小进行排序。
请假设有太多的数据点来手动指定它们应该出现的顺序 - 下面是一个代表性最小的子样本。
cite <- as.factor(c("A","B","C","B","A"))
or <- c(8.132075,3.475255,5.727273,4.334704,4.009901)
lowerCI <- c(4.6841118,1.5059889,-0.5582456,2.3612416,-2.6439191)
upperCI <- c(11.580039,5.444521,12.012791,6.308167,10.663721)
type <- as.factor(c("X","X","X","Y","Y"))
df <- data.frame(cite, or, lowerCI, upperCI, type)
df <- df[order(df$type, -xtfrm(df$or)), ] # Sorting within type by or
将摘要行添加到数据集的末尾,以便它们不被排序:
X.row <- list(cite="Summary",or=3.506705,lowerCI=1.5375528,upperCI=5.475857,type="X")
df[nrow(df) + 1, names(X.row)] <- X.row
Y.row <- list(cite="Summary",or=4.332824,lowerCI=2.3594369,upperCI=6.306212,type="Y")
df[nrow(df) + 1, names(Y.row)] <- Y.row
使用代码维护基于this answer的文件顺序:
df <- transform(df,cite=factor(cite,levels=unique(cite)))
绘图尝试:
plot<-ggplot(data=df, aes(y=cite, x=or, xmin=lowerCI, xmax=upperCI, shape = type)) +
geom_point(color = 'black', size=2)+
geom_errorbarh(height=.1)+
geom_point(data=subset(df,cite=='Summary'), color='black', size=5)+
facet_grid(type~., scales= 'free', space='free')+
scale_y_discrete(breaks=levels(df$cite),
labels=c(levels(df$cite)[1:3], expression(italic("Summary Effect"))))
问题在于第一个方面,而不是第二个方面,是经过适当分类的。所以我尝试了另一种建议here:
Xdat<-subset(df, type=="X")
Ydat<-subset(df, type=="Y")
Xdat <- transform(Xdat,cite=factor(cite,levels=unique(cite)))
Ydat <- transform(Ydat,cite=factor(cite,levels=unique(cite)))
plot2<-ggplot(mapping=aes(y=cite, x=or, xmin=lowerCI, xmax=upperCI, shape = type)) +
geom_point(data=Xdat,color = 'black', size=2)+
geom_point(data=subset(Xdat,cite=='Summary'), color='black', size=7)+
geom_errorbarh(data=Xdat,height=.1)+
geom_point(data=Ydat,color = 'black', size=2)+
geom_point(data=subset(Ydat,cite=='Summary'), color='black', size=7)+
geom_errorbarh(data=Ydat,height=.1)+
facet_grid(type~., scales= 'free', space='free')+
scale_y_discrete(breaks=levels(df$cite),
labels=c(levels(df$cite)[1:3], expression(italic("Summary Effect"))))
这会产生相同的结果。有任何想法吗?
ETA:我尝试按照建议发布here解决方案,并保持排序,但我现在无法正确显示y轴标签。
创建唯一的引用变量:
df$type <- factor(df$type, levels = c("X","Y"))
df$cite.type <- with(df, paste(cite, type, sep = "_"))
df$cite.type <- as.factor(df$cite.type)
df <- transform(df,cite.type=factor(cite.type,levels=unique(cite.type)))
df <- transform(df,cite=factor(cite,levels=unique(cite)))
绘图(请注意,我无法保留y=reorder(cite.type,or)
部分,因为这会改变摘要效果:
ggplot(data=df, aes(y=cite.type, x=or, xmin=lowerCI, xmax=upperCI, shape = type)) +
geom_point(color = 'black', size=2)+
geom_errorbarh(height=.1)+
geom_point(data=subset(df,cite=='Summary'), color='black', size=5)+
facet_grid(type~., scales= 'free', space='free')+
scale_y_discrete(breaks=levels(df$cite.type),
labels=c(levels(df$cite)[1:3], expression(italic("Summary Effect"))))
请注意,它现在已正确排序,但y轴标签仅按每个网站打印一次。