web-dev-qa-db-fra.com

geom_rect et alpha - cela fonctionne-t-il avec les valeurs codées en dur?

Même titre, complètement reformulé la question cependant.

Pourquoi l'alpha fonctionne-t-il dans la première parcelle mais pas dans la seconde? J'ai du mal à comprendre pourquoi, avec les valeurs codées en dur, le rect est dessiné au bon endroit mais pas transparent mais quand, dans un data.frame, cela fonctionne comme prévu?

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) 
41
nzcoops

Merci d'avoir clarifié votre question. Cela me rendait perplexe, alors je suis allé sur Google et je me suis retrouvé à apprendre quelque chose de nouveau (après avoir corrigé quelques aléas dans leurs exemples). Apparemment, vous tracez plusieurs rectangles les uns sur les autres, ce qui annule la semi-transparence souhaitée. Donc, les seuls moyens de surmonter cela sont de coder en dur les coordonnées du rectangle dans un fichier df séparé, 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")

... mais n'attribuez pas votre nom data.frame globalement à l'intrigue. À la place, utilisez-le uniquement dans le ou les calques de votre choix (dans cet exemple, geom_density), et laissez les autres calques exempts de df! Ou, mieux encore, utilisez annotate pour modifier votre tracé sous le df par défaut:

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

Cette dernière méthode vous permet d'utiliser un seul nom data.frame pour l'intégralité du tracé. Vous n'avez donc pas à spécifier le même df pour chaque couche.

Les deux méthodes renvoient des parcelles identiques:

enter image description here

82
sc_evans

Une autre solution consiste à donner à geom_rect un objet de données de ligne unique pour garantir que seul un rectangle est dessiné:

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

14
geotheory
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)
2
user2559998

Pour ceux qui tentaient de spécifier les valeurs de remplissage et les valeurs alpha dans geom_rect lors du traitement des facettes, j’avais besoin de spécifier une ligne dans le cadre de données correspondant à chaque facette pour que le rectangle apparaisse dans cette facette. Pour un tracé à trois facettes et deux rectangles s'étendant sur les 3 facettes:

plotpnts = ggplot(SHDates, aes(x=Order, y=NewMean))
Fig2 = plotpnts + 

# Rectangles for time periods   
geom_rect(data=SHDates[1,], xmin=0,ymin=500,xmax=39,ymax=1100, fill="red",    alpha=0.4) +
geom_rect(data=SHDates[11,], xmin=0,ymin=500,xmax=39,ymax=1100, fill="red", alpha=0.4) +
geom_rect(data=SHDates[22,], xmin=0,ymin=500,xmax=39,ymax=1100, fill="red", alpha=0.4) +
geom_rect(data=SHDates[1,], xmin=0,ymin=1000,xmax=39,ymax=1400, fill="orange", alpha=0.4) + 
geom_rect(data=SHDates[11,], xmin=0,ymin=1000,xmax=39,ymax=1400, fill="orange", alpha=0.4) + 
geom_rect(data=SHDates[22,], xmin=0,ymin=1000,xmax=39,ymax=1400, fill="orange", alpha=0.4) + 
0
LA Wandsnider