geom_rect e alpha – isso funciona com valores codificados?

Mesmo título, reformulou completamente a questão.

Por que o alfa funciona no primeiro enredo, mas não no segundo? Eu estou lutando para ver por que com valores codificados o rect é desenhado no lugar certo mas não é transparente, mas quando em um data.frame ele funciona como esperado?

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) 

Obrigado por esclarecer sua dúvida. Isso foi intrigante para mim, então eu fui para o Google, e acabei aprendendo algo novo (depois de trabalhar em torno de alguns caprichos em seus exemplos). Aparentemente, o que você está fazendo é desenhar muitos retângulos uns sobre os outros, anulando efetivamente a semi-transparência desejada. Então, as únicas maneiras de superar isso são codificar as coordenadas do retângulo em um df separado, ou …

 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") 

… apenas não atribua seus dados.frame globalmente ao enredo. Em vez disso, use-o apenas na (s) camada (s) desejada (neste exemplo, geom_density ) e deixe as outras camadas livres de df! Ou, melhor ainda, Use annotate para modificar sua plotagem sob o padrão 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") 

O último método permite que você use um único data.frame para todo o gráfico, assim você não precisa especificar o mesmo df para cada camada.

Ambos os methods retornam charts idênticos:

insira a descrição da imagem aqui

Outra solução é fornecer ao geom_rect um object de dados de linha única para garantir que apenas um retângulo seja desenhado:

 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) 

insira a descrição da imagem aqui

 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)