Як додати загальну мітку до граней у ggplot2?


84

У мене часто є числові значення для огранювання. Я хотів би надати достатньо інформації для інтерпретації цих граничних значень у додатковому заголовку, подібному до заголовків осей. Параметри етикеток повторюють набагато непотрібний текст і непридатні для довших назв змінних.

Будь-які пропозиції?

За замовчуванням:

test<-data.frame(x=1:20, y=21:40, facet.a=rep(c(1,2),10), facet.b=rep(c(1,2), each=20))
qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

введіть тут опис зображення

Що б я хотів:

введіть тут опис зображення

Найкраще, що я можу зробити в ggplot:

qplot(data=test, x=x, y=y)+facet_grid(facet.b~facet.a, labeller=label_both)

введіть тут опис зображення

Як вказує @Hendy, подібно до: додайте вторинну вісь y до графіків ggplot2 - зробіть це ідеальним


1
Свята корова. Я просто шукав це, знайшов через google ... а тепер бачу, що про це запитали хвилину тому. Здається, це питання ставить те саме на основі його коментаря, незважаючи на заголовок, який може означати інакше. Чудові макети для ілюстрації. Це саме моя проблема - було б непогано, якби мені не довелося пояснювати мої числові категорії аспектів. Графік повинен говорити сам за себе, використовуючи просту мітку, що пояснює, якими були грануючі змінні.
Hendy

3
Я поцікавився у Вінстона Чанга (не знаю його ручки SO), одного з основних розробників ggplot, електронною поштою. Він не вважає, що це наразі варіант, але може розглянути можливість його додавання. Він запропонував мені додати випуск на github, так і зробив
Хенді

1
Схоже, це потрапило до списку розсилки, і Вінстон дав мені знати. Він створив філію із загальною реалізацією цього для топ-лейблів. Дивіться нитку тут . @hadley: ти маєш рацію. Я не уявляю, як важко це робити взагалі. Якщо цього ніколи не трапиться ... моя вдячність за ggplot все ще переважає :)
Хенді

1
У якийсь момент я перестаю намагатись сварити R / ggplot2 і вносити деякі бажані зміни за допомогою редактора зображень.
Енді,

2
будь-яке оновлення щодо найкращих практик тут?
Артур Іп

Відповіді:


49

Оскільки останні ggplot2використовуються gtableвнутрішньо, змінити фігуру досить просто:

library(ggplot2)
test <- data.frame(x=1:20, y=21:40, 
                   facet.a=rep(c(1,2),10), 
                   facet.b=rep(c(1,2), each=20))
p <- qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

# get gtable object
z <- ggplotGrob(p)

library(grid)
library(gtable)
# add label for right strip
z <- gtable_add_cols(z, unit(z$widths[[7]], 'cm'), 7)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 1", rot = -90, gp = gpar(col = gray(1)))),
                     4, 8, 6, name = paste(runif(2)))

# add label for top strip
z <- gtable_add_rows(z, unit(z$heights[[3]], 'cm'), 2)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 2", gp = gpar(col = gray(1)))),
                     3, 4, 3, 6, name = paste(runif(2)))

# add margins
z <- gtable_add_cols(z, unit(1/8, "line"), 7)
z <- gtable_add_rows(z, unit(1/8, "line"), 3)

# draw it
grid.newpage()
grid.draw(z)

введіть тут опис зображення

Звичайно, ви можете написати функцію, яка автоматично додає мітки смужок. Майбутня версія ggplot2може мати цю функцію; не впевнений хоч.


- Мені цікаво, чи це все ще найчистіший підхід, станом на версію 0.9.3.1. Я не бачу чогось, що виглядає як "ця функціональність" в останній документації docs.ggplot2.org/0.9.3.1
yosukesabai

1
Версія 0.9.3.1 передбачає ggplotGrob()те саме, що і ggplot_gtable(ggplot_build()). Я думаю, що це все-таки найкращий спосіб.
kohske

1
Якщо я не помиляюся, це рішення вже не діє, оскільки деякі функції зараз застаріли.
Remi.b

1
@ Remi.b спробуй зараз
rawr

3
Це не працює з ggplot2 3.2.1 та R 3.6.1. Повідомлення про помилку відсутнє, але я не отримую мітки на отриманому графіку.
Калімо

5

Можливо, існує кращий спосіб це зробити, але ви можете:

fac1 = factor(rep(c('a','b'),10))
fac2 = factor(rep(c('a','b'),10))
data = data.frame(x=1:10, y=1:10, fac1=fac1, fac2=fac2)
p = ggplot(data,aes(x,y)) + ggplot2::geom_point() + 
facet_grid(fac1~fac2)
p + theme(plot.margin = unit(c(1.5,1.5,0.2,0.2), "cm"))
grid::grid.text(unit(0.98,"npc"),0.5,label = 'label ar right', rot = 270) # right
grid::grid.text(unit(0.5,"npc"),unit(.98,'npc'),label = 'label at top', rot = 0)   # top

1

На додаток до методу, описаного kohske, ви можете додати межу до полів, доданих шляхом зміни

col=NA

до

col=gray(0.5), linetype=1

Також змініть

fill=gray(0.5)

для

fill=grey(0.8)

і

gp=gpar(col=gray(1))

до

gp=gpar(col=gray(0))

Якщо ви хочете, щоб нові смужки відповідали міткам фасет

тобто

z <- gtable_add_grob(z, 
      list(rectGrob(gp = gpar(col = gray(0.5), linetype=1, fill = gray(0.8))),
      textGrob("Variable 1", rot = -90, gp = gpar(col = gray(0)))),
      4, 8, 6, name = paste(runif(2)))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.