ggplot2 и gridExtra: полностью удалить полосу в facet_grid - не только невидимую

У меня есть два графика, которые ям, расположив один над другим, следующим образом:

library(ggplot2)
library(gridExtra)
p1 
 Dieter Menne17 июн. 2013 г., 12:00
Мой обходной путь (в решетке, где я более бегло), чтобы добавить полоску к "просто" сюжет.

Ответы на вопрос(4)

в, которые будут иметь соответствующую информацию:

library(ggplot2)
library(gridExtra)
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() +
         xlab(NULL)
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() +
         facet_wrap( ~ cyl, ncol = 1)
grid.arrange(p1, p2, ncol=1)

Другое решение с использованием функций изgtable пакет. Он выравнивает графики, но сохраняет текст полосы. Он используетgtable Функция для вставки столбца справа отp1 равна ширине полосы текста.p2

library(ggplot2)
library(gridExtra)
library(gtable)

p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- p2 + facet_grid(cyl ~ .)

g1 = ggplotGrob(p1)
# gtable_show_layout(g1)  # View the layout
# g1$widths               # Get the widths of g1

g2 = ggplotGrob(p2)
# gtable_show_layout(g2)  # View the layout
# g2$widths               # Check the widths of g2

#  Add new column to the right of g1 equal in width the strip width of g2.
#  In g2, strip width is the 6th element the vector g2$widths
g1 <- gtable_add_cols(g1, g2$widths[6])  
grid.arrange(g1, g2, ncol=1)

## But note that if the y-axis titles and/or labels take up different widths, 
#  the two plots are not aligned
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() +
   theme(axis.title.y = element_text(vjust = .5, angle = 0, size = 30))
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- p2 + facet_grid(cyl ~ .)

g1 = ggplotGrob(p1)
g2 = ggplotGrob(p2)

g1 <- gtable_add_cols(g1, g2$widths[6])  # New column added to the right
grid.arrange(g1, g2, ncol=1)             # Plots are not aligned

# Need to set widths to the maximums in the two plots, 
# i.e., set g2 widths to be the same as g1 widths
g2$widths <- g1$widths
grid.arrange(g1, g2, ncol=1)            # Plots are aligned

РЕДАКТИРОВАТЬ: Или как предложено крещением, используйтеgtablerbind() функция:

g1 = ggplotGrob(p1)
g2 = ggplotGrob(p2)

g1 <- gtable_add_cols(g1, g2$widths[6], 5)  # New column added to the right 

library(grid)
grid.draw(rbind(g1, g2, size = "first"))
Решение Вопроса

чтобы найти ширину полосы, а затем установить поля обоих графиков равными нулю, но уменьшить размер полосы без полосы немного меньше (ширина полосы), чтобы онипоявиться быть одинакового размера. Методом проб и ошибок кажется, что полоса имеет ширину около 0,5 строки (но я думаю, вы могли бы понять это программно). Поэтому просто убедитесь, что на графике есть правильный участокбез текст полосы на 0,5 строки больше, чем текст с невидимой полосой:

#  Add a line of width 0.5 on the left but set all other margins to zero
p1 <- p1 + theme( plot.margin = unit( c(0,0.5,0,0) , units = "lines" ) )
#  Set all margins to zero, the strip will take up a phantom amount of invisible space
p2 <- p2 + theme(strip.text.y = element_blank() , 
  strip.background = element_blank(),
  plot.margin = unit( c(0,0,0,0) , units = "lines" ) )

grid.arrange(p1, p2, ncol=1)

Очевидно, вы можете настроить поля по своему усмотрению (например, добавить 1 к первой позиции в каждом числовом векторе вplot.margin чтобы получить границу в одну линию вдоль вершины каждого графика), при условии, что вы оставляете на 0,5 строки больше поля в правой границе второго графика, они будут выглядеть одинаково.

 Simon O'Hanlon17 июн. 2013 г., 12:19
@ClaireArmstrong Добро пожаловать! :-)
 Claire Armstrong17 июн. 2013 г., 12:19
Тот'отлично, спасибо!

Здесь другое решение с использованиемviewport а такжеgrid.layout, Я создаю 2 видовых экрана с двумя разными макетами. Затем я размещаю графики ggplot2, используя аргумент vp.

library(grid)
pushViewport(plotViewport(c(1,1,1,1),layout = grid.layout(2, 1)))
print(p2, vp = viewport(layout.pos.row = 2, layout.pos.col = 1))
pushViewport(viewport(layout.pos.row=1,
  layout = grid.layout(1, 2,widths = unit(c(1,1),c("null",'lines')))))
print(p1, vp = viewport(layout.pos.row = 1, layout.pos.col = 1))
upViewport(2)             

Ваш ответ на вопрос