10
votes

GGPLOT2 - Zone d'ombre ci-dessus

J'ai des données qui sont contraintes en dessous d'une ligne 1: 1. Je voudrais démontrer cela sur une parcelle en ombrant légèrement la zone au-dessus de la ligne, pour attirer l'attention du spectateur dans la zone située sous la ligne.

J'utilise qplot code> pour générer les graphiques . Rapidement, j'ai; p>

qplot (x, y) + geom_abline (pente = 1) code> p>

mais pour la vie de moi, ne peut pas comprendre Comment facilement ombrager la zone ci-dessus sans tracer un objet séparé. Y a-t-il une solution facile pour cela? P>


EDIT FORT> P>

OK, JOnan, voici un exemple de jeu de données: P>

ggplot(df,aes(x,y,color=var1))+
 facet_wrap(~var2)+
 geom_abline(slope=1,intercept=0,lwd=0.5)+
 geom_point(size=3)+
 scale_color_manual(values=c("red","blue"))+
 geom_polygon(data=df_poly,aes(x,y),fill="blue",alpha=0.2)


5 commentaires

Les points de coloriage et les polygones de remplissage sont gérés par deux esthétiques différentes (couleur et remplissage) et ne doivent pas entrer en conflit, alors je soupçonne que vous vous trompez peut-être quelque chose de mal. Je serais heureux d'aider certains autres mais je ne peux pas sans un exemple reproductible spécifique des données que vous essayez de comploter ...


Terminé. Je soupçonne que cela provient de mon inconnu avec comment GGPLot2 gère de telles choses. Merci encore pour votre aide, je l'apprécie beaucoup.


Déplacer couleur = var1 à geom_point : geom_point (AES (couleur = var1), ...) . De plus, si vous souhaitez que différents polygones remplis de chaque facette soient conscients que vous devez créer une trame de données distincte pour chaque facette et les combiner dans un seul cadre de données comprenant le facteur var2 , donc GGPLOT sait lequel s'appliquer à chaque facette.


J'ai mis à jour ma réponse en utilisant vos données d'exemple; J'espère que cela pourra aider...


@ Joran - Bien sûr, merci pour toute votre aide!


3 Réponses :


10
votes

Autant que je sache, il n'y a pas d'autre solution autre que de créer un polygone avec un remplissage alpha-mélangé. Par exemple: xxx

Entrez la description de l'image ici


5 commentaires

Les choses sont beaucoup plus compliquées si la ligne ne fonctionne pas du coin au coin, ce qui est susceptible de se produire si la ligne si elle est tracée sur un autre ensemble de données. J'ai bricolé un peu mais je ne pouvais pas venir avec une solution générale.


La solution générale doit être le long des lignes telles que décrites dans Stackoverflow.com/Questtions/6786982/...


Merci pour vos solutions! J'ai essayé Andrie, mais j'ai précisé que les points sont colorés par une troisième variable qplot (x, y, couleur = z) , qui ne joue pas bien avec le geom_polygon () déclaration. La ligne est également asymétrique inférieure à celle d'origine que je ne peux pas comprendre. Des idées?


Le paramètre couleur contrôle généralement la couleur de la ligne. Vous devez spécifier remplir pour changer l'intérieur d'un polygone.


@jslefche j'ai reconstitué une réponse qui le fait un peu plus généralement (pour les lignes, au moins) ...



16
votes

bâtiment de la réponse de @ Andrie Voici une solution générale plus (mais pas complètement) qui gère ombrage au-dessus ou au-dessous d'une ligne donnée dans la plupart des cas.

Je n'ai pas utilisé la méthode que @andrie référencée Here Depuis que je rencontrais des problèmes avec ggplot code> La tendance à étendre automatiquement les étendues de l'intrigue lorsque vous ajoutez des points près des bords. Au lieu de cela, cela construit manuellement les points de polygone à l'aide de inf code> et -inf code> au besoin. Quelques notes: p>

  • Les points doivent être dans l'ordre "correct" dans la trame de données, car ggplot code> parcourt le polygone dans l'ordre que les points apparaissent. Donc, il ne suffit pas d'obtenir les sommets du polygone, ils doivent être commandés (dans le sens horaire ou dans le sens inverse des aiguilles d'une montre). P> Li>

  • Cette solution suppose que la ligne que vous traquez ne provoque pas elle-même ggplot code> pour prolonger la plage de tracé. Vous verrez dans mon exemple que je choisis une ligne à dessiner en choisissant deux points dans les données et en tirant sur elles. Si vous essayez de dessiner une ligne trop loin du reste de vous, ggplot code> modifiera automatiquement les gammes de tracé et devient difficile de prédire ce qu'ils seront. P> li > ul>

    Premièrement, voici la fonction qui construit la trame de données de polygone: p> xxx pré>

    Il attend les gammes X et Y de vos données (comme dans GAMME () CODE>), la pente et l'interception de la ligne que vous allez tracer et que vous souhaitiez nuire au-dessus ou en dessous de la ligne. Voici le code que j'ai utilisé pour générer les quatre exemples suivants: p> xxx pré>

    et voici quelques exemples des résultats. Si vous trouvez des bugs, bien sûr, laissez-moi savoir de manière à mettre à jour cette réponse ... p>

    shade_above1 p>

    shade_above2 p>

    shade_below1 p>

     shade_below2 p>

    edit stry> p>

    mise à jour pour illustrer la solution à l'aide des données d'op de OP: P>

    set.seed(1)
    dat <- data.frame(x=runif(6,-2,2),y=runif(6,-2,2),
            var1=rep(c("A","B"),3),var2=rep(c("C","D"),3))
    #Create polygon data frame
    df_poly <- buildPoly(range(dat$x),range(dat$y))
    
    ggplot(data=dat,aes(x,y)) + 
        facet_wrap(~var2) +
        geom_abline(slope=1,intercept=0,lwd=0.5)+
        geom_point(aes(colour=var1),size=3) + 
        scale_color_manual(values=c("red","blue"))+
        geom_polygon(data=df_poly,aes(x,y),fill="blue",alpha=0.2)
    


0 commentaires

4
votes

basé sur une version minimale modifiée de @ Joran's Réponse :

ggplot(data=dat,aes(x,y)) +
  facet_wrap(~var2) +
  geom_abline(slope=1,intercept=0,lwd=0.5)+
  geom_point(aes(colour=var1),size=3) +
  scale_color_manual(values=c("red","blue"))+
  geom_section(data=data.frame(slope=c(-1,1), above=c(FALSE,TRUE), selected=c("selected","selected 2")), 
               aes(slope=slope, above=above, intercept=0, fill=selected), size=1) +
  expand_limits(x=3)


1 commentaires

Merci pour une réponse assez fantastique à une ancienne question. :-)