2017-02-22 56 views
2

Я пытаюсь редактировать некоторые графики, созданные ggplot2, используя функции, предоставляемые сеткой пакетов и gridExtra. Я понимаю, что только ggplot2 может создавать действительно красивые многогранные сюжеты. Однако в некоторых случаях мне нравится создавать отдельные сюжеты, а затем объединять их вместе позже. Пытаясь сделать именно это, я столкнулся с каким-то неожиданным поведением с использованием cbind() с grid.draw() или grid.arrange() при использовании графика ggplot2, который был отредактирован. Ниже приведен код для MWE:Неожиданное поведение с использованием cbind с измененным ggplotGrobs

#Load libraries 
    library(ggplot2); library(gridExtra) 

#Load data 
    data(mtcars) 

#Ggplot 
    p = qplot(wt,mpg,data=mtcars,color=cyl) 
    grob = ggplotGrob(p) 

#Bold xlabel 
    grobEdited = editGrob(grid.force(grob),gPath("xlab","GRID.text"),grep=TRUE,gp=gpar(fontface="bold")) 

#Visualize 
    grid.newpage() 
    grid.draw(grobEdited) 

enter image description here

Он работал, как ожидалось. Теперь, чтобы проиллюстрировать эту проблему, позволяет cbind() два одинаковых отредактированных графиков ggplot2:

#Cbind example with edited graphs 
    grid.newpage() 
    grid.draw(cbind(grobEdited,grobEdited)) 

enter image description here

Он не работает, как ожидалось! Теперь проверьте cbind() на неопубликованных графах:

#Cbind example with grob 
    grid.newpage() 
    grid.draw(cbind(grob,grob)) 

enter image description here

Работы, как и ожидалось. Я новичок в сетчатых фигурах, так что я что-то делаю неправильно?

+0

вопрос с 'grid.force()' вызова. Документация предполагает, что рисование результата может не иметь смысла в другом контексте рисования. Вы можете удалить эту часть кода? –

+0

@ ryan-morton 'grid.force()' позволяет функциям редактирования иметь доступ ко всем гнетам в графе ggplot2, поэтому в этом контексте я считаю, что это необходимо. Думаю, я мог бы вручную отредактировать grob w/o, используя функции редактирования (что заставит думать намного сложнее). – user13317

+1

Возможно, попробуйте 'cbind'ing перед редактированием ..' grobEdited = editGrob (grid.force (cbind (grob, grob)), gPath ("xlab", "GRID.text"), global = TRUE, grep = TRUE, gp = gpar (fontface = "bold", col = "red")) ' – user20650

ответ

1

Я публикую ответ, следующий за комментарием от пользователя @ user20650. Самый простой обходной путь заключается в cbind() в ggplot2 графиков перед редактированием их с помощью функции редактирования, предоставляемые grid или gridExtra:

#Edit after cbind()        
    grobEdited = editGrob(grid.force(cbind(grob,grob)),gPath("xlab","GRID.text"),global=TRUE,grep=TRUE,gp=gpar(fontface="bold")) 

#Visualize 
    grid.newpage() 
    grid.draw(grobEdited) 

enter image description here