2016-06-20 15 views
2

Мне нужно устроить несколько графиков для фигуры. Я создаю отдельные сюжеты, используя базовую и сетчатую графику. Чтобы упорядочить их на одном рисунке, я использовал grid.echo(), grid.grab(), чтобы преобразовать в grobs, а затем arrangeGrob() и grid.arrange(), чтобы построить окончательную цифру. Несколько недель назад моя пробная фигура работала нормально, но теперь, когда я повторно запускаю код, она создает фигуру с пробелами на полях участков.Пространство, сгенерированное в grid.arrange

добавить минимальный пример, который показывает проблему, которую я обращенную ...

##minimal example 
library(grid) 
library(gridExtra) 
library(gridGraphics) 
##test plot 
plot_n1<-plot(1:10,1:10, asp=1) 

##convert test plot to grob 
grid.echo() 
test_p<-grid.grab() 

##simulate several plots arranged in a more complex layout 
multi<-arrangeGrob(test_p, test_p, test_p, test_p, ncol=1, heights=c(1/4,1/4,1/4,1/4)) 

##create graph 
png(filename="minimal_multiplot.png", res=300, width=20, height=20, units="cm") 
grid.arrange(test_p, multi, ncol=2, widths=c(2/3,1/3)) 
dev.off() 

Что я делаю неправильно?

+1

Пожалуйста, вы можете редактировать в пакеты, которые вы должны запустить этот пример (я работал его, но не смог найти решение). Установка 'clip = 'на' 'в' organizeGrob' делает его немного лучше. –

+0

Большое спасибо Ричарду! Отлично работал с моим кодом! :)) –

+0

'grid.echo()/grid.grab()' являются относительно новыми дополнениями, и из того, что я могу сказать, все еще нестабильно. Я не думаю, что многое может быть сделано на стороне gridExtra, кроме таких обходных решений. – baptiste

ответ

0

Там действительно, как представляется, проблема при преобразовании graphics участка в grid участок, а затем с помощью grid.grab(), чтобы захватить и затем нарисовать сюжет в небольшие регионы (например, с помощью метода). Например, используя видовые экраны для определения немного меньшей области (цветной серый на изображении ниже), отсутствует материал оси.

# Packages 
library(grid) 
library(gridGraphics) 

plot(1:10,1:10) 

grid.echo() 
test_p = grid.grab() 

grid.newpage() 
pushViewport(viewport(x = 0, width = .85, just = "left")) 
grid.rect(gp = gpar(col = NA, fill = "grey90")) 
grid.draw(test_p) 
upViewport() 
grid.rect(gp = gpar(col = "grey90", size = .1, fill = NA)) 

enter image description here

Но Павел Мюррелл (автор gridGraphics пакета) предлагает альтернативу (см примеры на ?gridGraphics::grid.echo и стр. 156-157 из The gridGraphics package in The R Journal v7/1). Можно определить функцию, которая рисует график, тогда эта функция становится аргументом grid.echo() во время рисования графика в окне просмотра. newpage = FALSE останавливается grid от открытия новой страницы. Обратите внимание, что ни один из материалов оси не отрубается.

pf = function() { 
    plot(1:10,1:10) 
} 

grid.newpage() 
pushViewport(viewport(x = 0, width = .85, just = "left")) 
grid.rect(gp = gpar(col =NA, fill = "grey90")) 
grid.echo(pf, newpage=FALSE) 
upViewport() 
grid.rect(gp = gpar(col = "grey90", size = .1, fill = NA)) 

enter image description here

Таким образом, чтобы получить желаемый участок, я хотел бы сделать что-то подобное - но все-таки с помощью видовых.

pf = function() { 
par(mar=c(7.2, 7.2, 1, 1), mex = .3, tcl = .15, mgp = c(3, .15, 0)) 
plot(1:10, 1:10, cex.axis = .75, cex.lab = .75) 
} 

grid.newpage() 

pushViewport(viewport(layout = grid.layout(3, 2, 
     widths = unit(c(2, 1), "null"), 
     heights = unit(c(1, 1, 1), "null")))) 

pushViewport(viewport(layout.pos.col = 1, layout.pos.row = 1:3)) 
grid.echo(pf, newpage = FALSE) 
upViewport() 

for(i in 1:3) { 
pushViewport(viewport(layout.pos.col = 2, layout.pos.row = i)) 
grid.echo(pf, newpage = FALSE) 
upViewport() 
} 

upViewport() 
grid.rect(gp = gpar(col = "grey90", size = .1, fill = NA)) 

enter image description here

Смежные вопросы