7
votes

Ajouter des rectangles autour des valeurs communes dans ggplot

Lorsque je fais un design expérimental, j'utilise ggplot pour montrer la mise en page. Voici un exemple simple:

df$Mainplot <- ceiling(df$Row/3) + 3*(ceiling(df$Col/2) - 1)


5 commentaires

Vous pouvez dessiner des lignes verticales et horizontales à des positions spécifiées.


Est-ce qu'ils doivent tous être dans une seule rue? Si, par "une certaine structure", vous voulez dire peut-être bloquer des facteurs dans votre expérience, je pense qu'une approche intuitive serait de les facettes, ce qui permet également de bonnes étiquettes et fournit essentiellement la même séparation visuelle. Si vous avez facet_wrap, le DF ci-dessus par MainPlot Il indique immédiatement les facteurs «Blocage» produisant diverses confondes indésirables avec des paires de rangées et de colonnes.


Il y a une parenthèse supplémentaire dans votre exemple, il devrait être: df <- data.frame (bloc = rep (1: 2, chacun = 18), rangée = représentant (1: 9, 4), col = REP ( 1: 4, chacun = 9), traitement = échantillon (C (1: 6), remplacer = f))


@Distribecology - Merci d'avoir souligné cela, fixé maintenant


@Andyw: parfaitement raisonnablement suggestion, mais cela est en fait à l'intérieur d'un facteur de blocage. Idéalement, j'aimerais pouvoir le faire pour plusieurs niveaux de «blocs» (bien que la puissance principale ne soit pas un bloc, mais d'une conception de tracé de bande). Donc, malheureusement faceting ne vous aidera pas ici.


3 Réponses :


2
votes

Voici une solution qui pourrait être plus facile. Il suffit d'utiliser geom_tille code> avec alpha défini sur 0. Je n'ai pas pris le temps de vous donner une solution exacte, mais voici un exemple. Pour réaliser ce que vous voulez, je devine que vous devriez créer un nouveau cadre de données, qui devrait être suffisamment facile.

df <- data.frame(Block=rep(1:2, each=18),Row=rep(1:9, 4),Col=rep(1:4, each=9),Treat=sample(c(1:6),replace=F))
df$blocking <- rep(sort(rep(1:3,3)),4)
df.p <- ggplot(df, aes(Row, Col)) + geom_tile(aes(fill=as.factor(Treat)))
df.p+ geom_tile(data=df,aes(x=Row,y=blocking),colour="black",fill="white",alpha=0,lwd=1.4)


1 commentaires

Je ne suis pas sûr que cela puisse réellement être aussi simple - j'ai eu un coup d'œil juste, et je pense que la complication vient du fait que vous ne pouvez pas simplement redéfinir les axes pour le faire fonctionner. Par exemple, Mainplot 1 doit être autour d'une zone de 3 x 2 (colonne de rangée x). Lorsque j'applique votre méthode, chaque parcelle est liée plutôt que le groupe d'eux. Appréciez l'idée cependant. BTW, vous pouvez simplement remplir = "transparent" plutôt qu'un réglage de remplissage + alpha.



6
votes

Voici une solution possible où je crée une donnée auxiliaire.frame pour tracer des bordures avec geom_rect () . Je ne suis pas sûr que cela soit aussi simple que vous le souhaitez! J'espère que le code qui calcule les coordonnées du rectangle sera réutilisable / généralisable avec juste un peu d'effort supplémentaire. XXX

 Entrez la description de l'image ici


2 commentaires

Merci, cela fonctionne certainement, mais est probablement sur un pair avec ma solution actuelle, que je posterai aussi.


Après avoir réfléchi à cela un peu plus, j'accepte votre réponse, l'application à une solution générale est très proche et je suis convaincu aucune solution simple n'existe actuellement.



0
votes

Je pensais que cela mériterait de poster ma propre solution (non idéale), car il semble qu'il n'y ait rien d'évident que je manque. Je vais laisser la question sans réponse dans l'espoir que quelqu'un viendra avec quelque chose.

À l'heure actuelle, j'utilise Geom_rect d'une manière qui pourrait probablement être rendue générale (peut-être dans une addition Geom_borer ?? ). Pour l'exemple de ma question, les informations essentielles sont que chaque plot principal est 3 x 2. p>

Ajout sur df.p code> de la question initiale, c'est ce que je fais actuellement: P>

df.p1 <- df.p + geom_rect(aes(xmin=((Mainplot- 3*(ceiling(Col/2)-1) )-1)*3 + 0.5,
                         xmax=((Mainplot - 3*(ceiling(Col/2)-1))-1)*3 + 3.5,
                         ymin=ceiling(ceiling(Col/2)/2 + 2*(ceiling(Col/2)-1))-0.5,
                         ymax=2*ceiling(Col/2)+0.5),
                     colour="black", fill="transparent",size=1)


0 commentaires