2016-03-06 10 views
4

Следующий код использовался, но больше не работает. Кто-нибудь знает, что происходит? Это должно быть некоторое изменение в базовом файле gtable.Установка ширины в объекте gtable обрушивает график; это работало, но больше этого не происходит.

require(cowplot) # for plot_grid() 
require(grid) # for unit_max() 

# make two plots 
plot.iris <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + 
    geom_point() + facet_grid(. ~ Species) + stat_smooth(method = "lm") + 
    background_grid(major = 'y', minor = "none") + 
    panel_border() 
plot.mpg <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl))) + 
    geom_point(size=2.5) 

g.iris <- ggplotGrob(plot.iris) # convert to gtable 
g.mpg <- ggplotGrob(plot.mpg) # convert to gtable 

iris.widths <- g.iris$widths[1:3] # extract the first three widths, 
            # corresponding to left margin, y lab, and y axis 
mpg.widths <- g.mpg$widths[1:3] # same for mpg plot 
max.widths <- unit.pmax(iris.widths, mpg.widths) # calculate maximum widths 
g.iris$widths[1:3] <- max.widths # assign max. widths to iris gtable 
g.mpg$widths[1:3] <- max.widths # assign max widths to mpg gtable 

plot_grid(g.iris, g.mpg, labels = "AUTO", ncol = 1) 

Полученный график выглядит следующим образом: enter image description here

Что это должно выглядеть это (с линии оси у идеально выровнены по вертикали): enter image description here

ошибка, кажется, происходит в эта линия:

g.iris$widths[1:3] <- max.widths 

Любое понимание будет оценено по достоинству.

Обратите внимание, что подобные решения были использованы в течение длительного времени, см., Например, here. И функция plot_grid() в cowplot использует код, подобный этому, также для выравнивания графиков, и он все еще работает. Так что это полностью озадачило меня. не

ответ

7

Редактировать
С grid версии 3.3.0, это больше не является проблемой. То есть строки кода, содержащие grid:::unit.list() ниже, могут быть удалены.

Проблема заключается в том, чтобы установить единицы измерения. Посмотрите на g.iris$widths. Вы заметите, что цифры есть, но единицы были сброшены. См. Это question and answer и this one. После преобразования участков в gtables, вам нужно: g.iris$widths = grid:::unit.list(g.iris$widths)

require(grid) # for unit_max() 
require(cowplot) 

# make two plots 
plot.iris <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + 
    geom_point() + facet_grid(. ~ Species) + stat_smooth(method = "lm") + 
    background_grid(major = 'y', minor = "none") + 
    panel_border() 
plot.mpg <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl))) + 
    geom_point(size=2.5) 

g.iris <- ggplotGrob(plot.iris) # convert to gtable 
g.mpg <- ggplotGrob(plot.mpg) # convert to gtable 

g.iris$widths = grid:::unit.list(g.iris$widths) 
g.mpg$widths = grid:::unit.list(g.mpg$widths) 

iris.widths <- g.iris$widths[1:3] # extract the first three widths, 
            # corresponding to left margin, y lab, and y axis 
mpg.widths <- g.mpg$widths[1:3] # same for mpg plot 

max.widths <- unit.pmax(iris.widths, mpg.widths) # calculate maximum widths 

g.iris$widths[1:3] <- max.widths # assign max. widths to iris gtable 
g.mpg$widths[1:3] <- max.widths # assign max widths to mpg gtable 

plot_grid(g.iris, g.mpg, labels = "AUTO", ncol = 1) 
+2

действительно, 'Сетка ::: unit.list()' необходимо было в течение некоторого времени; Я забыл, когда начал замечать разрыв с ggplot2. Эта неэкранированная функция сетки стала почти обязательным требованием для такого выравнивания графика, что может быть проблематичным в пакете. – baptiste

+1

Спасибо большое! Проблема с осевыми линиями является ошибкой в ​​последней версии ggplot2 версии 2.1.0. Это уже исправлено в github с отправкой в ​​CRAN. –

+0

Спасибо за это. –