web-dev-qa-db-fra.com

Ajouter les axes x et y à tous les facet_wrap

Il est souvent souhaitable de minimiser l'encre dans un tracé. J'ai un complot à facettes (facet_wrap) et souhaite retirer autant d'encre que possible tout en conservant la lisibilité. Je l'ai configuré comme je le souhaite, sauf que les axes x et y ne sont pas présents pour les facettes (sous-tracés) sauf à l'extrême gauche ou en bas. Avec tant d'encre enlevée, je crois que l'œil a besoin de ces indices et je demande comment placer les axes x et y dans tous les tracés d'un facet_wrap. Ci-dessous est mon code jusqu'à présent, la sortie actuelle et la sortie souhaitée (les lignes rouges sont le complément souhaité):

library(ggplot); library(grid)

ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() + 
    facet_wrap(~carb) +
    theme(panel.grid = element_blank(),
        panel.background = element_rect(fill = "white", colour = "black"), 
        panel.border = element_rect(fill = NA, colour = "white"), 
        axis.line = element_line(),
        strip.background = element_blank(),
        panel.margin = unit(2, "lines"))

tracé actuel enter image description here

Terrain souhaité enter image description here

29
Tyler Rinker

la manière la plus simple serait d'ajouter des segments dans chaque panneau de tracé,

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() + 
  facet_wrap(~carb) +
  theme_minimal() +
  annotate("segment", x=-Inf, xend=Inf, y=-Inf, yend=-Inf)+
  annotate("segment", x=-Inf, xend=-Inf, y=-Inf, yend=Inf)

example

28
baptiste

Cela devrait simplifier considérablement les choses:

library('ggthemes')
ggplot(mtcars, aes(mpg, hp)) + geom_point() + facet_wrap(~carb, scales='free') + 
    theme_tufte() + theme(axis.line=element_line()) + 
    scale_x_continuous(limits=c(10,35)) + scale_y_continuous(limits=c(0,400))

enter image description here

28
Thomas

Le paquet lemon ajoute cette fonctionnalité; voir cette vignette . (Exemple de code et tracé à partir de là.)

library(lemon)
p + facet_rep_grid(drv ~ cyl) + coord_capped_cart(bottom='both', left='both') +
  theme_bw() + theme(panel.border=element_blank(), axis.line=element_line())

From the lemon documentation:

6
Aaron

Suite à la réponse de Thomas d'en haut -

Il vous suffit de définir scales='free' dans facet_wrap et assurez-vous de définir les limites dans scale_x_continuous et scale_y_continuous

ggplot(mtcars, aes(mpg, hp)) + geom_point() + facet_wrap(~carb, scales='free') + 
    scale_x_continuous(limits=c(10,35)) + scale_y_continuous(limits=c(0,400))
5
Tal Galili

Voici une longue solution de contournement.

Tout d'abord, stockez votre tracé d'origine en tant qu'objet, puis créez un autre tracé qui n'a pas de graduations d'axe et de textes d'axe.

p1<-ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() + 
  facet_wrap(~carb) +
  theme(panel.grid = element_blank(),
        panel.background = element_blank(), 
        panel.border = element_blank(), 
        axis.line = element_line(),
        strip.background = element_blank(),
        panel.margin = unit(2, "lines"))

p2<-ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() + 
  facet_wrap(~carb) +
  theme(panel.grid = element_blank(),
        panel.background = element_blank(), 
        panel.border = element_blank(), 
        axis.line = element_line(),
        strip.background = element_blank(),
        panel.margin = unit(2, "lines"),
        axis.ticks=element_blank(),
        axis.text=element_blank())

Utilisez maintenant la fonction ggplotGrob() pour convertir les deux tracés en grobs. Si nous regardons la structure de ces grobs, vous verrez que l'axe y visible est les grob 14 et 17 (les autres sont des grobs zéro), et l'axe x sont les grobs 23 à 25.

g1<-ggplotGrob(p1)
g2<-ggplotGrob(p2)
g2
TableGrob (12 x 12) "layout": 28 grobs
    z         cells       name                                     grob
1   0 ( 1-12, 1-12) background          rect[plot.background.rect.3481]
2   1 ( 4- 4, 4- 4)    panel-1                gTree[panel-1.gTree.3356]
3   2 ( 4- 4, 7- 7)    panel-2                gTree[panel-2.gTree.3366]
4   3 ( 4- 4,10-10)    panel-3                gTree[panel-3.gTree.3376]
5   4 ( 8- 8, 4- 4)    panel-4                gTree[panel-4.gTree.3386]
6   5 ( 8- 8, 7- 7)    panel-5                gTree[panel-5.gTree.3396]
7   6 ( 8- 8,10-10)    panel-6                gTree[panel-6.gTree.3406]
8   7 ( 3- 3, 4- 4)  strip_t-1    absoluteGrob[strip.absoluteGrob.3448]
9   8 ( 3- 3, 7- 7)  strip_t-2    absoluteGrob[strip.absoluteGrob.3453]
10  9 ( 3- 3,10-10)  strip_t-3    absoluteGrob[strip.absoluteGrob.3458]
11 10 ( 7- 7, 4- 4)  strip_t-4    absoluteGrob[strip.absoluteGrob.3463]
12 11 ( 7- 7, 7- 7)  strip_t-5    absoluteGrob[strip.absoluteGrob.3468]
13 12 ( 7- 7,10-10)  strip_t-6    absoluteGrob[strip.absoluteGrob.3473]
14 13 ( 4- 4, 3- 3)   axis_l-1 absoluteGrob[axis-l-1.absoluteGrob.3433]
15 14 ( 4- 4, 6- 6)   axis_l-2         zeroGrob[axis-l-2.zeroGrob.3434]
16 15 ( 4- 4, 9- 9)   axis_l-3         zeroGrob[axis-l-3.zeroGrob.3435]
17 16 ( 8- 8, 3- 3)   axis_l-4 absoluteGrob[axis-l-4.absoluteGrob.3441]
18 17 ( 8- 8, 6- 6)   axis_l-5         zeroGrob[axis-l-5.zeroGrob.3442]
19 18 ( 8- 8, 9- 9)   axis_l-6         zeroGrob[axis-l-6.zeroGrob.3443]
20 19 ( 5- 5, 4- 4)   axis_b-1         zeroGrob[axis-b-1.zeroGrob.3407]
21 20 ( 5- 5, 7- 7)   axis_b-2         zeroGrob[axis-b-2.zeroGrob.3408]
22 21 ( 5- 5,10-10)   axis_b-3         zeroGrob[axis-b-3.zeroGrob.3409]
23 22 ( 9- 9, 4- 4)   axis_b-4 absoluteGrob[axis-b-4.absoluteGrob.3415]
24 23 ( 9- 9, 7- 7)   axis_b-5 absoluteGrob[axis-b-5.absoluteGrob.3421]
25 24 ( 9- 9,10-10)   axis_b-6 absoluteGrob[axis-b-6.absoluteGrob.3427]
26 25 (11-11, 4-10)       xlab             text[axis.title.x.text.3475]
27 26 ( 4- 8, 2- 2)       ylab             text[axis.title.y.text.3477]
28 27 ( 2- 2, 4-10)      title               text[plot.title.text.3479]

Donc, utilisez les grobs correspondants du tracé 2 pour remplacer zéro grobs dans le tracé 1 et vous obtiendrez des lignes d'axe.

g1[[1]][[15]]<-g2[[1]][[14]]
g1[[1]][[16]]<-g2[[1]][[14]]
g1[[1]][[18]]<-g2[[1]][[14]]
g1[[1]][[19]]<-g2[[1]][[14]]
g1[[1]][[20]]<-g2[[1]][[23]]
g1[[1]][[21]]<-g2[[1]][[23]]
g1[[1]][[22]]<-g2[[1]][[23]]

grid.draw(g1)

enter image description here

4
Didzis Elferts