在ggplot facets中对子集进行排序和/或维护文件顺序

时间:2017-05-17 05:38:26

标签: r sorting ggplot2

我正在使用or创建效果大小(表示为X)的森林图,其类型(Yggplot2)分面。

我希望每个方面的第一行是该方面的摘要效果大小(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"))))

结果: Attempt 1

问题在于第一个方面,而不是第二个方面,是经过适当分类的。所以我尝试了另一种建议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"))))

结果如下: enter image description here

请注意,它现在已正确排序,但y轴标签仅按每个网站打印一次。

0 个答案:

没有答案