Как добавить общую метку к фасетам в ggplot2?



у меня часто есть числовые значения для фасетирования.
Я хотел бы предоставить достаточную информацию для интерпретации этих значений фасетирования в дополнительном заголовке, аналогичном заголовкам оси.
Параметры labeller повторяют много ненужного текста и непригодны для более длинных заголовков переменных.



какие предложения?



по умолчанию:



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)


enter image description here



что бы я хотел:



enter image description here



лучшее, что я могу сделать в ggplot:



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


enter image description here



как указано @Hendy, аналогично:
добавить вторую ось Y на ggplot2 участков - сделать его совершенным

591   3  

3 ответов:

как последний 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)

enter image description here

конечно, вы можете написать функцию, которая автоматически добавляет метки полосы. Будущая версия ggplot2 может иметь эту функциональность; не уверен, хотя.

в дополнение к методу, описанному 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))

если вы хотите, чтобы новые полосы соответствовали меткам фасета

ie

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

может быть лучший способ сделать это, но вы можете:

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

Comments

    Ничего не найдено.