огранка на основе geom_point, когда ggplot() пуст и существует несколько затененных geom_rect [дубликаты]

Я пытаюсь затенить несколько областей интереса на точечной диаграмме. Основываясь на этом ответе, я считаю, что вынужден чтобы оставить начальный вызов ggplot() пустым и предоставить вызовы geom_rect() перед вызовом geom_point(). У меня все это работает. Однако я не могу применить фасет на основе данных, переданных в geom_point().

Следующее правильно отображает мои данные (диаграмма рассеяния по красным и синим областям разных размеров):

ggplot() + 
geom_rect(aes(xmin=885, xmax=1544, ymin=-Inf, ymax=Inf), alpha=.2, fill = "red") +
geom_rect(aes(xmin=1858, xmax=2580, ymin=-Inf, ymax=Inf), alpha=.2, fill = "blue") +
geom_point(data=df, aes(x=Position, y=Max_Freq))

Однако все следующее приводит к следующим ошибкам:

+ facet_wrap(~Replicate)
#Error in if (empty(data)) { : missing value where TRUE/FALSE needed

+ facet_wrap(data~Replicate)
#Error in combine_vars(data, params$plot_env, rows, drop = params$drop):
#  At least one layer must contain all variables used for facetting

+ facet_wrap(data$Replicate)
#Error in data$Replicate : object of type 'closure' is not subsettable

В других графах, когда df предоставляется в вызове ggplot() (т.е. ggplot(df, aes(x=Position, y=Max_Freq)), первая опция правильно разделяет данные. По общему признанию, я не очень хорошо разбираюсь в R, но похоже, что это должно иметь простое решение.


person ded    schedule 28.06.2018    source источник
comment
Другие варианты, позволяющие избежать перерисовки прямоугольников, — это использовать annotate с geom = "rect" вместо geom_rect() или поместить данные прямоугольника в отдельный data.frame и использовать его для этих слоев. Любая из этих опций позволяет определить глобальный набор данных, а не повторять построение прямоугольников.   -  person aosmith    schedule 29.06.2018
comment
Ответы на этот вопрос показывают все эти варианты.   -  person aosmith    schedule 29.06.2018
comment
Каков класс переменной Replicate? Это фактор?   -  person Tarssio Barreto    schedule 29.06.2018


Ответы (1)


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

некоторые данные:

df <- data.frame(x = rnorm(20),
                 y = runif(20),
                 facet = sample(c("A", "B"),
                                20,
                                replace = TRUE))

создайте фрейм данных с geom_rect координатами:

rect1 <- data.frame(xmin = -1,
                    xmax = 1,
                    ymin = -Inf,
                    ymax = Inf,
                    facet = c("A", "B"))

постройте это:

ggplot() + 
  geom_rect(data = rect1 , aes(xmin = xmin,
                               xmax = xmax,
                               ymin = ymin,
                               ymax = ymax),
            alpha = 0.2, fill = "blue") +
  geom_point(data = df, aes(x = x, y = y))+
  facet_wrap(~facet)

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

Это позволяет индивидуально настраивать прямоугольники. Пример:

rect2 <- data.frame(xmin = c(-1, 0),
                    xmax = c(0, 2),
                    ymin = c(-Inf, 0.25),
                    ymax = Inf,
                    facet = c("A", "B"))

ggplot() + 
  geom_rect(data = rect2 , aes(xmin = xmin,
                               xmax = xmax,
                               ymin = ymin,
                               ymax = ymax,
                               fill = facet),
            alpha = 0.2) +
  geom_point(data = df, aes(x = x, y = y))+
  facet_wrap(~facet)

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

или просто построить прямоугольники в некоторых гранях:

rect3 <- data.frame(xmin = -1,
                    xmax = 0, 
                    ymin = 0.25,
                    ymax = Inf,
                    facet = "A")

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

person missuse    schedule 29.06.2018