Подтвердить что ты не робот

Geom_rect и alpha - работает ли это с жестко закодированными значениями?

То же название, полностью переформулировало вопрос.

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

mtcars$cyl <- factor(mtcars$cyl)
mtcars$am <- factor(mtcars$am)

ggplot(mtcars) +
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(data=data.frame(xmin=100, xmax=200, ymin=0, ymax=Inf), aes(xmin=xmin, xmax=xmax, ymin=ymin,ymax=ymax), fill="red", alpha=0.2) 

ggplot(mtcars) +
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(aes(xmin=100, xmax=200, ymin=0,ymax=Inf), fill="red", alpha=0.2) 
4b9b3361

Ответ 1

Спасибо за разъяснение вашего вопроса. Это меня озадачило, поэтому я пошел в google и закончил изучение чего-то нового (после того, как он работал над некоторыми капризами в своих примерах). Очевидно, что вы делаете рисование многих прямоугольников друг над другом, что фактически сводит на нет полупрозрачность, которую вы хотите. Таким образом, единственные способы преодоления этого - жестко закодировать координаты прямоугольника в отдельном df или...

ggplot() + 
  geom_density(data=mtcars, aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) +
  geom_rect(aes(xmin=100, xmax=200, ymin=0,ymax=Inf), alpha=0.2, fill="red")

... просто не присваивайте свой файл data.frame по всему миру. Вместо этого используйте его только в том слое (ы), который вы хотите (в этом примере, geom_density), и оставьте остальные уровни df-free! Или, еще лучше, используйте annotate для изменения вашего графика из-под стандартного df:

ggplot(mtcars) + 
  geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
  annotate("rect", xmin=100, xmax=200, ymin=0, ymax=Inf, alpha=0.2, fill="red") 

Последний метод позволяет использовать единый data.frame для всего графика, поэтому вам не нужно указывать один и тот же df для каждого слоя.

Оба метода возвращают одинаковые графики:

enter image description here

Ответ 2

Другим обходным решением является предоставление geom_rect объекта данных с одной строкой, чтобы обеспечить только один прямоугольник:

ggplot(mtcars) +
  geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
  geom_rect(data=mtcars[1,], aes(xmin=100, xmax=200, ymin=0,ymax=Inf), fill="red", alpha=0.2)

enter image description here

Ответ 3

ggplot(df, aes(xmin = x, xmax = x + 1, ymin = y, ymax = y + 2)) +
  geom_rect(alpha=.2) + 
  geom_rect(data=data.frame(xmin=3, xmax=6, ymin=3, ymax=5), 
            aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax), 
            fill="green", alpha=.2)