Добавление geom_line ко всем граням на графике facet_wrap в R

Я пытаюсь создать график facet_wrap, который сравнивает четыре отдельные строки с общей пятой строкой; цель состоит в том, чтобы эта пятая линия появлялась на всех четырех других графиках facet_wrap.

Вот мой минимальный код:

library(ggplot2)

x    = c( 1,  3,  1,  3,  2,  4,  2,  4)
y    = c( 1,  3,  2,  4,  1,  3,  2,  4)
type = c("A","A","B","B","C","C","D","D")
data = data.frame(x,y,type)

x    = c( 4,  1)
y    = c( 1,  4)
type = c("E","E")
line = data.frame(x,y,type)

ggplot(data, aes(x,y)) + geom_line() + facet_wrap(~type) +
geom_line(data = line, aes(x,y))

Я надеялся, что добавление пятой строки как независимого data.frame позволит мне это сделать, но он просто добавляет ее как пятую грань, как на следующем изображении:

Плохой сюжет

Я хочу, чтобы грань "E" отображалась на всех остальных графиках. Какие-нибудь мысли? Я знаю, что geom_vline, geom_hline и geom_abline будут появляться на всех гранях, но я не уверен, что делает их уникальными.


person hfisch    schedule 04.12.2013    source источник


Ответы (2)


Вы указали type='E' в своем line data.frame. Если вы хотите иметь эту строку для типа A,B,C,D, создайте data.frame с типами, для которых вы хотите, чтобы строка отображалась

xl    = c( 4,  1)
yl    = c( 1,  4)
type =rep(LETTERS[1:4], each=2)
line2 = data.frame(x=xl,y=yl,type)

ggplot(data, aes(x,y)) + geom_line() + facet_wrap(~type) +
   geom_line(data = line2)

Вы также можете использовать annotate, что означает, что вы не указываете data.frame, а передаете значения x и y напрямую

ggplot(data, aes(x,y)) + geom_line() + facet_wrap(~type) +
  annotate(geom='line', x=xl,y=yl)

Оба создают

введите здесь описание изображения

person mnel    schedule 04.12.2013
comment
Вы даже можете полностью опустить столбец типа, например line2 = data.frame(x=xl,y=yl). Линия будет одинаковой на всех панелях, тогда... - person Mark Heckmann; 12.11.2015
comment
У меня такая же проблема, но это решение больше не работает: Ошибка: вы передаете функцию как глобальные данные. Вы неправильно написали аргумент data в ggplot()? - person Adrian Martin; 06.03.2020
comment
Это все еще работает для меня, поэтому @AdrianMartin, должно быть, наткнулся на некоторые другие проблемы, когда он не мог заставить это работать. - person madsR; 27.05.2021

Вы также можете использовать geom_abline(...) следующим образом:

x    <-  c( 1,  3,  1,  3,  2,  4,  2,  4)
y    <-  c( 1,  3,  2,  4,  1,  3,  2,  4)
type <-  c("A","A","B","B","C","C","D","D")
data <-  data.frame(x,y,type)

int   <- c(5,5,5,5)
slope <- c(-1,-1,-1,-1)
type  <- c("A","B","C","D")
ref   <- data.frame(int, slope, type)
ggplot(data, aes(x,y)) + geom_line() + facet_wrap(~type, scales="free") +
  geom_abline(data = ref, aes(intercept=int, slope=slope), color="red", size=2)

Что дает это:

person jlhoward    schedule 05.12.2013
comment
Возможно, я сделал свой воспроизводимый пример слишком простым; мой реальный код на самом деле имеет больше, чем две точки. Я должен был добавить третий пункт, чтобы проиллюстрировать мою проблему. Несмотря на это, ваш ответ определенно решает вопрос, который я задал. - person hfisch; 05.12.2013