简体   繁体   English

在ggplot2中,coord_flip和自由缩放不能一起使用

[英]In ggplot2, coord_flip and free scales don't work together

Here is some example data for a hypothetical meta-analysis on the effectiveness of sports-promotion interventions for which I would like to create a forest plot: 以下是关于体育促进干预效果的假设荟萃分析的一些示例数据,我想创建一个森林情节:

example.df = data.frame(Author = c("McAuliffe et al.", "Palen et al.", "Manning et al.", "Richters et al.", "Grello et al.","Mpofu et al.", "Kuo & St Lawrence", "Langstrom & Hanson", "Ompad et al.", "Abdullah et al.","Yan", "Peltzer & Pengpid", "Lo & Wei", "Haggstrom-Nordin et al.", "Mwaba & Naidoo", "Hughes et al.","Lydie et al.", "Zimmer-Gembeck et al.", "Babalola", "Garos et al.", "Pinkerton et al."),
                    Sport = c("Basketball", "Basketball", "Baseball", "Dance", "Baseball", "Dance", "Wrestling","Wrestling", "Dance", "Baseball", "Wrestling", "Dance", "Swimming", "Swimming","Basketball", "Basketball", "Basketball", "Basketball", "Basketball", "Swimming", "Wrestling"),
                    Gender = c("Male", "Female", "Male", "Male", "Female", "Male", "Male", "Male", "Male", "Female","Female", "Male", "Female", "Female", "Female", "Male", "Female", "Female", "Female", "Male", "Female"),
                    d = c(-0.12, 0.53, 0.11, 0.02, 0.32, 0.04, 0.03,0.04,0.26, 0.76, 1.11, 0.34, 0.77, 1.19, 0.59, 0.15, 0.30, 0.81, 0.12, 0.11, 1.01),
                    d_SE = c(.10, .04, .06, .01, .11, .08, .08, .04, .05, .05, .14, .07, .05, .08, .19, .16, .07, .16, .06, .18, .15))

The data frame contains author names, the sport, whether the sample was male or female, the effect size for the intervention, and the standard error of the effect size. 数据框包含作者姓名,运动,样本是男性还是女性,干预的效果大小以及效果大小的标准误差。 I am hoping to create a dot plot mapping shape to gender, and faceting by the particular sport. 我希望创建一个点图,将形状映射到性别,并通过特定的运动进行分面。 After following examples in Chang's "cookbook" and this related query , I've come up with the following code that meets most of my formatting needs: 在关注Chang的“cookbook”和相关查询中的示例后,我提出了满足大部分格式需求的以下代码:

p<-ggplot(example.df, aes(x=Author, y=d, ymin=d-1.96*d_SE, ymax=d+1.96*d_SE,shape=Gender))+ 
geom_pointrange() + 
coord_flip()+
scale_y_continuous(limits=c(-2,2),breaks=c(-2,-1.5,-1,-0.5,0,.5,1,1.5,2))+
geom_hline(yintercept=0, color="grey60",linetype="dashed")+
theme_bw()+
theme(panel.grid.major.x=element_blank(),panel.grid.minor.x=element_blank(),panel.grid.major.y=element_line(color="grey60",linetype="dashed"))+
facet_grid(Sport ~ ., scales="free_y")
p

My problem, however, is that the resulting plots for each facet (below) have every author in the entire data frame plotted on the y-axis (technically x-axis, but the axes are flipped). 然而,我的问题是,每个方面(下方)的结果图在整个数据框中的每个作者都绘制在y轴上(技术上是x轴,但轴是翻转的)。 Instead, I only want the authors with data relevant to a given facet to be plotted on the author-associated axis of that facet, so each facet should have a different list of authors on the axis. 相反,我只希望具有与给定构面相关的数据的作者绘制在该构面的作者关联轴上,因此每个构面应在轴上具有不同的作者列表。

在此输入图像描述

I had thought the scales="free_y" component of the facet_grid layer would ensure a unique author axis for each facet (I've also tried scales="free_x" , given the inverted axes), but this is not having the intended effect. 我原以为facet_grid图层的scales="free_y"组件会确保每个构面的唯一作者轴(我也尝试过scales="free_x" ,给定反转的轴),但这没有达到预期的效果。

Does anyone know of a way that I could ensure that the only author names that appear on each facet's axis are the ones with associated data for that facet? 有没有人知道我可以确保每个方面的轴上出现的唯一作者姓名是那些与该方面相关的数据?

Andrie's right, in that coord_flip() seems to be the root of the issue. Andrie是对的,因为coord_flip()似乎是问题的根源。 However, the convention for forest plot formatting is to have the author names on y-axis, so I wanted to find a way that still would meet this formatting requirement. 但是,森林图格式的约定是在y轴上有作者名称,所以我想找到一种仍然符合这种格式要求的方法。

The accepted answer in the post that Gregor commented on actually solves my issue; Gregor评论过的帖子中接受的答案实际上解决了我的问题; the only required change was that I had to calculate columns for upper-bound/lower-bound values of the confidence intervals. 唯一需要的改变是我必须计算置信区间的上限/下限值的列。

So now with the updated data frame: 所以现在有了更新的数据框:

example.df = data.frame(Author = c("McAuliffe et al.", "Palen et al.", "Manning et al.", "Richters et al.", "Grello et al.","Mpofu et al.", "Kuo & St Lawrence", "Langstrom & Hanson", "Ompad et al.", "Abdullah et al.","Yan", "Peltzer & Pengpid", "Lo & Wei", "Haggstrom-Nordin et al.", "Mwaba & Naidoo", "Hughes et al.","Lydie et al.", "Zimmer-Gembeck et al.", "Babalola", "Garos et al.", "Pinkerton et al."),
                    Sport = c("Basketball", "Basketball", "Baseball", "Dance", "Baseball", "Dance", "Wrestling","Wrestling", "Dance", "Baseball", "Wrestling", "Dance", "Swimming", "Swimming","Basketball", "Basketball", "Basketball", "Basketball", "Basketball", "Swimming", "Wrestling"),
                    Gender = c("Male", "Female", "Male", "Male", "Female", "Male", "Male", "Male", "Male", "Female","Female", "Male", "Female", "Female", "Female", "Male", "Female", "Female", "Female", "Male", "Female"),
                    d = c(-0.12, 0.53, 0.11, 0.02, 0.32, 0.04, 0.03,0.04,0.26, 0.76, 1.11, 0.34, 0.77, 1.19, 0.59, 0.15, 0.30, 0.81, 0.12, 0.11, 1.01),
                    d_SE = c(.10, .04, .06, .01, .11, .08, .08, .04, .05, .05, .14, .07, .05, .08, .19, .16, .07, .16, .06, .18, .15),
                    ci.low = c(-.30, .45, .00, -.01, .11, -.12, -.14, -.04, .16, .66, .84, .19, .68, 1.03, .22, -.17, .17, .50, .00, -.23, .72),
                    ci.high = c(.07, .62, .22, .05, .53, .20, .19, .11, .36, .87, 1.38, .47, .86, 1.35, .97,.47, .43, 1.11, .24, .46, 1.30))

#reorder Author based on value of d, so effect sizes can be plotted in descending order
example.df$Author<-reorder(example.df$Author, example.df$d, FUN=mean)

...and then for the plot (without any coord_flip() usage): ...然后为情节(没有任何coord_flip()用法):

p <- ggplot(example.df, aes(y = Author, x = d, xmin = ci.low, xmax = ci.high, shape=Gender)) +
geom_point() +
geom_errorbarh(height = .1) +
scale_x_continuous(limits=c(-2,2),breaks=c(-2,-1.5,-1,-0.5,0,.5,1,1.5,2))+
geom_vline(xintercept=0, color="grey60",linetype="dashed")+
facet_grid(Sport ~ ., scales = "free", space = "free") +
theme_bw() +
theme(strip.text.y = element_text(angle = 0))
p

在此输入图像描述

Very nice--thanks for all the suggestions and help troubleshooting this plot! 非常好 - 感谢所有的建议,并帮助解决这个情节!

It seems that coord_flip() and free scales in the facets don't work well together. 似乎coord_flip()和facet中的自由缩放不能很好地协同工作。 This is a known issue ( number 95 in the ggplot2 issue log ) and indications are that the fix is a huge rewrite and will not be done soon. 这是一个已知问题( ggplot2问题日志中的数字95 ),并且有迹象表明修复是一次巨大的重写,不会很快完成。 Hadley says: 哈德利说:

Free scales aren't going to be working with non-Cartesian coordinates systems for a long time :/ 自由尺度长时间不适用于非笛卡尔坐标系:/

This means your only workaround may be to remove the coord_flip() . 这意味着您唯一的解决方法可能是删除coord_flip() For example: 例如:

Try this: 尝试这个:

library(ggplot2)
ggplot(example.df, aes(x=Author, y=d, ymin=d-1.96*d_SE, ymax=d+1.96*d_SE, shape=Gender, col=Gender))+ 
  geom_pointrange() + 
#   coord_flip()+
  scale_y_continuous(limits=c(-2,2),breaks=c(-2,-1.5,-1,-0.5,0,.5,1,1.5,2))+
  theme_bw()+
  theme(
    panel.grid.major.x=element_blank(),
    panel.grid.minor.x=element_blank(),
    axis.text.x = element_text(angle=90, hjust=1)
    ) +
  facet_grid(. ~ Sport, scales="free_x", space="free_x", shrink=TRUE, drop=TRUE)

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM