Добавьте оси x и y ко всем facet_wrap

19

Часто желательно минимизировать чернила на графике. У меня есть граненый сюжет ( facet_wrap ) и вы хотите удалить как можно больше чернил, но сохраняйте удобочитаемость. Я настроил его так, как хотелось бы, за исключением того, что оси x и y отсутствуют для граней (подзаголовков), если только они не находятся слева или снизу. С удалением большого количества чернил, я считаю, что глаза нуждаются в этих репликах, и я спрашиваю, как поставить оси x и y на все участки в пределах facet_wrap . Ниже мой код до сих пор, текущий вывод и активированный вывод (красные линии - это желаемое дополнение):

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

Текущий график

Желаемый график

    
задан Tyler Rinker 01.03.2014 в 16:48
источник
  • Я не смог найти ошибку «unit» на вашем примере. –  Thomas 01.03.2014 в 17:11
  • @ Твои извинения. позвольте мне добавить используемые библиотеки. –  Tyler Rinker 01.03.2014 в 17:28
  • Вы не можете сделать это легко, потому что элемент темы axis.line не будет отображаться на каждой панели, если scales = «free», а элемент theme panel.border - это прямоугольник, и вы не можете указать разные значения для разных сторон элемента прямоугольника. Вы можете подделать его с помощью geom_vline и geom_hline, но будет трудно заставить его выглядеть правильно. –  Ista 01.03.2014 в 17:29
  • Вы можете получить некоторые идеи из ответов @ baptiste здесь и здесь. –  Henrik 01.03.2014 в 17:40
  • gridExtra :: borderGrob (type = 9) может помочь, если ggplot2 допустил некоторую гибкость в элементах темы. –  baptiste 01.03.2014 в 17:42
Показать остальные комментарии

4 ответа

20

Самый простой способ - добавить сегменты в каждую панель сюжета,

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)

    

ответ дан baptiste 01.03.2014 в 18:15
источник
23

Это должно значительно упростить ситуацию:

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

    
ответ дан Thomas 01.03.2014 в 17:20
источник
  • Самый легкий ответ, к сожалению, весы = «бесплатно» для меня нехорошо. +1 –  Tyler Rinker 01.03.2014 в 18:10
  • @TylerRinker См. редактирование. Не заметили, что вы сдерживаете все в одних и тех же масштабах. –  Thomas 01.03.2014 в 18:38
  • Этот ответ не соответствует последней версии ggplot2 2.2.1 –  wikiselev 23.02.2017 в 14:20
  • @wikiselev работает для меня w / ggplot2_2.2.1 и ggthemes_3.4.0 –  Thomas 23.02.2017 в 15:07
  • @ Томас хорошо, но, полагаю, это из-за ggthemes? Сам ggplot не работает? –  wikiselev 24.02.2017 в 17:24
3

Вот длинный обходной путь.

Сначала сохраните исходный сюжет как объект, а затем создайте еще один график, который не имеет тиков оси и текстов осей.

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

Теперь используйте функцию ggplotGrob() , чтобы преобразовать обе графики в grobs. Если мы посмотрим на структуру этих гномов, вы увидите, что видимая ось y - это grob 14 и 17 (другие - нулевые grobs), а ось x - грыбы 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]

Итак, используйте соответствующие грыбы графика 2, чтобы заменить нулевые грызуны на рисунке 1, и вы получите линии осей.

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)

    
ответ дан Didzis Elferts 01.03.2014 в 17:38
источник
  • почему бы просто не добавить сегменты к каждой панели с помощью gtable? –  baptiste 01.03.2014 в 17:46
  • @baptiste Потому что я не знаю, как это сделать. Вы можете это показать. –  Didzis Elferts 01.03.2014 в 17:50
  • Хорошо работает, но я вижу, что крещение предоставило более обобщаемый ответ, который он удалил. +1 –  Tyler Rinker 01.03.2014 в 18:10
  • @TylerRinker Да, ответ баптиста намного лучше. –  Didzis Elferts 01.03.2014 в 18:12
0

После ответа Томаса сверху -

Вам просто нужно установить scales='free' в facet_wrap и не забудьте установить ограничения в scale_x_continuous и 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))
    
ответ дан Tal Galili 20.03.2018 в 15:00
источник