В ggplot2 координаты и свободные шкалы не работают вместе

Вот некоторые примеры данных для гипотетического метаанализа об эффективности мероприятий по продвижению спорта, для которых я хотел бы создать лесной участок:

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))

Кадр данных содержит имена авторов, спорт, является ли образец мужчиной или женщиной, размер эффекта для вмешательства и стандартная ошибка размера эффекта. Я надеюсь создать форму отображения точки сюжета для пола и украсить особый вид спорта. После следующих примеров в 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

Моя проблема, однако, в том, что полученные графики для каждой грани (ниже) имеют каждого автора во всем фрейме данных, нанесенном на ось y (технически ось x, но оси перевернуты). Вместо этого я хочу, чтобы авторы с данными, относящимися к данной грани, были построены на ассоциированной с автором осью этой грани, поэтому каждая грань должна иметь другой список авторов на оси.

enter image description here

Я подумал, что компонент scales="free_y" уровня facet_grid обеспечит уникальную ось автора для каждой грани (я также пробовал scales="free_x", учитывая перевернутые оси), но это не имеет предполагаемого эффекта,

Кто-нибудь знает, каким образом я могу гарантировать, что единственные имена авторов, которые появляются на каждой оси фасета, являются теми, у которых есть связанные данные для этой грани?

Ответ 1

Andrie right, в этом coord_flip(), кажется, корень проблемы. Тем не менее, соглашение о форматировании лесного участка состоит в том, чтобы иметь имена авторов по оси Y, поэтому я хотел найти способ, который все еще соответствовал бы требованию форматирования.

Принятый ответ в сообщении который Грегор прокомментировал, фактически решает мою проблему; единственное обязательное изменение заключалось в том, что мне приходилось вычислять столбцы для значений верхней границы/нижней границы доверительных интервалов.

Итак, теперь с обновленным фреймом данных:

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)

... и затем для графика (без использования 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

enter image description here

Очень приятно - спасибо за все предложения и помогите разобраться в этом сюжете!

Ответ 2

Кажется, что coord_flip() и свободные масштабы в гранях не работают вместе. Это известная проблема (номер 95 в журнале проблем ggplot2), и указывает на то, что исправление является огромным переписанием и не будет сделано в ближайшее время, Хэдли говорит:

Свободные масштабы не будут работать с некартезианскими системами координат в течение длительного времени:/

Это означает, что единственным способом обхода может быть удаление coord_flip(). Например:

Попробуйте следующее:

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)

enter image description here