web-dev-qa-db-ja.com

2つのグラフエッジを左揃え(ggplot)

Ggplotを使用しており、2つのグラフを重ねて表示します。 gridExtraのgrid.arrangeを使用してそれらをスタックしました。問題は、軸ラベルに関係なく、グラフの左端と右端を揃えたいことです。 (1つのグラフのラベルが短く、もう1つのグラフのラベルが長いため、問題が発生します)。

質問:
これどうやってするの?私はgrid.arrangeと結婚していませんが、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)

enter image description here

103
Tyler Rinker

これを試して、

 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)

編集

以下は、gridExtraに含まれるrbind.gtableの修正バージョンを使用した、より一般的なソリューションです(任意の数のプロットで機能します)。

gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
grid::grid.newpage()
grid::grid.draw(rbind(gA, gB))
127
baptiste

これを任意の数のプロットに一般化したいと思いました。 Baptisteによるアプローチを使用した段階的なソリューションを次に示します。

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.callを使用して最大幅を取得します

maxwidth <- do.call(grid::unit.pmax, widths)

各グロブに最大幅を割り当てます

for (i in 1:length(grobs)){
     grobs[[i]]$widths[2:5] <- as.list(maxwidth)
}

plot

do.call("grid.arrange", c(grobs, ncol = 1))
36
slizb

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")

enter image description here

26
zx8754

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'))
12
Wilbert

Reshape2パッケージのmeltfacet_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)

enter image description here

8
bdemarest

Eggパッケージは、ggplotオブジェクトを標準化された3x3 gtableにラップし、ファセットを含む任意のggplot間のプロットパネルの整列を可能にします。

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)

enter image description here

7
baptiste

これは古い投稿であり、既に回答されていることは知っていますが、@ baptisteのアプローチとpurrrを組み合わせて見栄えを良くすることをお勧めします。

library(purrr)
list(A, B) %>% 
  map(ggplotGrob) %>% 
  do.call(gridExtra::gtable_rbind, .) %>% 
  grid::grid.draw()
0
Felipe Gerard

せいぜいこれはハックです:

library(wq)
layOut(list(A, 1, 2:16),  list(B, 2:3, 1:16))

それは本当に間違っているように感じます。

0
Tyler Rinker