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)
Ответы
Ответ 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)