выровнять слева два ребра графика (ggplot)
Я использую ggplot и имею два графика, которые я хочу отображать друг на друга. Я использовал grid.arrange
от gridExtra, чтобы сложить их. Проблема в том, что я хочу, чтобы левые края графиков выровнялись, а также правые края независимо от меток оси. (проблема возникает из-за того, что метки одного графа короткие, а другой длинный).
Вопрос:
Как я могу это сделать? Я не замужем за грид.организовать но ggplot2 является обязательным.
что я пробовал:
Я попытался играть с шириной и высотой, а также ncol и nrow, чтобы сделать сетку 2 x 2 и разместить визуальные элементы в противоположных углах, а затем играть с шириной, но я не мог получить визуальные элементы в противоположных углах.
require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip()
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip()
grid.arrange(A, B, ncol=1)
8 ответов:
попробуйте это,
gA <- ggplotGrob(A) gB <- ggplotGrob(B) maxWidth = grid::unit.pmax(gA$widths[2:5], gB$widths[2:5]) gA$widths[2:5] <- as.list(maxWidth) gB$widths[2:5] <- as.list(maxWidth) grid.arrange(gA, gB, ncol=1)
Edit
вот более общее решение (работает с любым количеством участков) с использованием модифицированной версии
rbind.gtable
входит вgridExtra
gA <- ggplotGrob(A) gB <- ggplotGrob(B) grid::grid.newpage() grid::grid.draw(rbind(gA, gB))
Я хотел обобщить это для любого количества участков. Вот пошаговое решение с использованием подхода Батиста:
plots <- list(A, B, C, D) grobs <- list() widths <- list()
соберите ширины для каждого гроба каждого участка
for (i in 1:length(plots)){ grobs[[i]] <- ggplotGrob(plots[[i]]) widths[[i]] <- grobs[[i]]$widths[2:5] }
используйте do.звоните, чтобы получить максимальную ширину
maxwidth <- do.call(grid::unit.pmax, widths)
asign максимальная ширина для каждого гроба
for (i in 1:length(grobs)){ grobs[[i]]$widths[2:5] <- as.list(maxwidth) }
участка
do.call("grid.arrange", c(grobs, ncol = 1))
С помощью cowplot:
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() library(cowplot) plot_grid(A, B, ncol=1, align="v")
On http://rpubs.com/MarkusLoew/13295 это действительно простое решение (последний пункт) Применительно к этой проблеме:
require(ggplot2);require(gridExtra) A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() grid.draw(rbind(ggplotGrob(A), ggplotGrob(B), size="first"))
вы также можете использовать это как для ширины и высоты:
require(ggplot2);require(gridExtra) A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() C <- ggplot(CO2, aes(x=conc)) + geom_bar() +coord_flip() D <- ggplot(CO2, aes(x=uptake)) + geom_bar() +coord_flip() grid.draw(cbind( rbind(ggplotGrob(A), ggplotGrob(B), size="first"), rbind(ggplotGrob(C), ggplotGrob(D), size="first"), size='first'))
вот еще одно возможное решение, используя
melt
из пакета reshape2 иfacet_wrap
:library(ggplot2) library(reshape2) dat = CO2[, c(1, 2)] dat$id = seq(nrow(dat)) mdat = melt(dat, id.vars="id") head(mdat) # id variable value # 1 1 Plant Qn1 # 2 2 Plant Qn1 # 3 3 Plant Qn1 # 4 4 Plant Qn1 # 5 5 Plant Qn1 # 6 6 Plant Qn1 plot_1 = ggplot(mdat, aes(x=value)) + geom_bar() + coord_flip() + facet_wrap(~ variable, nrow=2, scales="free", drop=TRUE) ggsave(plot=plot_1, filename="plot_1.png", height=4, width=6)
The
egg
пакет обертывает объекты ggplot в стандартизированный3x3
gtable, что позволяет выравнивать панели участков между произвольными ggplots, в том числе фасетными.library(egg) # devtools::install_github('baptiste/egg') library(ggplot2) p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point() p2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point() + facet_wrap( ~ cyl, ncol=2, scales = "free") + guides(colour="none") + theme() ggarrange(p1, p2)