2016-01-25 2 views
9

Недавно я обновился до версии R 3.2.3, а также до версии ggplot 2.0.0.Ggplot2 различное поведение альфа

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

Теперь мой вопрос в том, является ли это ошибкой или функцией (если да, может кто-нибудь просветить меня, почему это так хорошо)? В результате я хочу иметь (очевидно) Заговор 2.

Say I участок линии и лежал прямоугольник с прозрачностью над ним, как это:

library(ggplot2) 

plot_data <- data.frame(x = 1:100, y = rnorm(100)) 

# Plot 1 
ggplot(data = plot_data, aes(x = x, y = y)) + 
    geom_line() + 
    geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", 
      alpha = 0.1) + ggtitle("Plot 1") 

# Plot 2 
ggplot() + 
    geom_line(data = plot_data, aes(x = x, y = y)) + 
    geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", 
      alpha = 0.1) + ggtitle("Plot 2") 

моему пониманию участка 1 и 2 должны быть одинаковыми , Тем не менее, я получаю следующие участки:

Участок 1:

Plot1

и участок 2:

Plot2

Кроме того, если я поиграться с alpha -значения (для например, установив их на 0.01, я получу два следующих графика:

Plot1a

и

Plot2a

+3

в вашем участке 2, если добавить данные = plot_data к вашему geom_rect() вы получите те же результаты, как Plot1 – MLavoie

+0

Что интересно, но не отражает альфа 0,1 (вполне прозрачно) для моего понимания ! – David

ответ

2

Я считаю, что вызов geom_rect без параметра data будет эффективно использовать отдельный прямоугольник для каждой строки data.frame именно поэтому alpha «работает», но не совсем как и ожидалось. Я не смог реплицировать и перейти к паритету/соглашению между методами, но, как вы отметили, я думаю, что он делает что-то по линии рисования либо 100 отдельных прямоугольников, либо 30 (ширина прямоугольников, от 20 до 50), поэтому alpha = 0.1/100 и alpha = 0.1/30 приближает вас, но не совсем подходит.

Несмотря на это, я бы, вероятно, использовать annotate, как лучше описывает поведение/результат вы пытаетесь достичь без проблем и работает, как и следовало ожидать, в обоих случаях - annotations нарисует одного экземпляра в geom:

ggplot(data = plot_data, aes(x = x, y = y)) + 
    # geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, alpha = 0.1, fill = "red")) + 
    annotate("rect", xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, alpha = 0.1, fill = "red") + 
    geom_line() + 
    ggtitle("Plot 1") 

ggplot() + 
    geom_line(data = plot_data, aes(x = x, y = y)) + 
    # geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", alpha = 0.1) + 
    annotate("rect", xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, fill = "red", alpha = 0.1) + 
    ggtitle("Plot 2") 
+0

Рисунок 1 прямоугольника для каждой строки, вероятно, вызывает его, по крайней мере, это кажется правдоподобным для меня! – David

+0

@ Давид нашел [аналогичный вопрос здесь] (http://stackoverflow.com/q/15903868/2572423), который ссылается на ту же логику/рассуждение; меня все еще беспокоит, что я не могу заставить их «соответствовать». – JasonAizkalns

+0

Я также наткнулся на этот [вопрос] (http://stackoverflow.com/questions/17521438/geom-rect-and-alpha-does-this-work-with-hard-coded-values), в котором упоминается использование только одного строка в 'geom_rect' .. – David

Смежные вопросы