从/sf/answers/930711631/,我学会了如何安排两个具有对齐绘图区域的图.
我的问题是:我怎样才能得到被安排的地块的对象?
例:
require(ggplot2)
require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip()
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip()
gA <- ggplot_gtable(ggplot_build(A))
gB <- ggplot_gtable(ggplot_build(B))
maxWidth = grid::unit.pmax(gA$widths[2:3], gB$widths[2:3])
gA$widths[2:3] <- as.list(maxWidth)
gB$widths[2:3] <- as.list(maxWidth)
## works:
grid.arrange(gA, gB, ncol=1)
## does not work:
theplot <- grid.arrange(gA, gB, ncol=1, plot=FALSE)
Run Code Online (Sandbox Code Playgroud) 更新了问题以纳入已在SO上回答的部分解决方案
我正在使用ggplot2创建几个图并将图gridExtra组合成一个图,其中包含多个面板,所有图都在一列中.我的问题是我不能让点图行之间的空间在两个图中都是一致的.

library(ggplot2)
# data
dat1 <- data.frame(VARIABLES=c("Item 1", "Item 2 is a little longer"),
est=c(.3, .5),
min=c(.2, .4),
max=c(.4, .7))
dat2 <- data.frame(VARIABLES=c("Item 3",
"Item 4 is even longer if you can believe it",
"And there is a third item",
"And a fourth item"),
est=c(.3, .5, .3, .5),
min=c(.2, .4, .2, .4),
max=c(.4, .7, .4, .7))
dat <- c("dat1", "dat2")
labs <- c("Plot 1", "Plot2")
# create plots
count <- 1
for (i in dat) …Run Code Online (Sandbox Code Playgroud) 我想使用R markdown生成一个pdf文档,以显示在for循环中使用ggplot创建的一系列图.是否可以控制每页上的绘图数量,例如,每页有2 X 2的绘图网格?
我想保持灵活性,以便我可以更改图形的总数,以便它在适当数量的页面上分割.
我在下面尝试使用ggplot2和gridExtra包,但我无法控制每页的图形数量,似乎只想将它们压缩到一个sinlge页面.我已经尝试在grid.arrange中更改ncol,nrow,height,width参数但它似乎没有帮助.
---
title: "ggplot Layout"
output: pdf_document
---
```{r,figure2 fig.height=8, fig.width=6,echo=FALSE,message=FALSE}
library(ggplot2)
library(gridExtra)
graphlist<-list()
count <- 1
colnums<-c(1,5,6,7,8,9,10)
for (i in colnums) {
plot.x.name<-names(diamonds[i])
p <- ggplot(data=diamonds,aes_string(x = plot.x.name)) + geom_histogram()
graphlist[[count]]<-p
count <- count+1
}
do.call("grid.arrange",c(graphlist,ncol=2))
```
Run Code Online (Sandbox Code Playgroud)
我正在寻找的东西的类型由此代码(改编自http://kbroman.github.io/knitr_knutshell/pages/figs_tables.html)证明 ,但不幸的是,这不适用于ggplot.
---
title: "Example Layout"
output: pdf_document
---
```{r bunch_o_figs,fig.height=8, fig.width=6, message=FALSE,echo=FALSE}
n <- 100
x <- rnorm(n)
par(mfrow=c(2,2), las=1)
for(i in 1:20) {
y <- i*x + rnorm(n)
plot(x, y, main=i) …Run Code Online (Sandbox Code Playgroud) 我想知道如何在 gridExtra 2.0.0 中执行以前版本中可以执行的操作来更改表格宽度/高度填充,例如:
grid.arrange(tableGrob(mtcars,padding.h=unit(1,"mm"),padding.v=unit(1,"mm")))
Run Code Online (Sandbox Code Playgroud)
(抱歉,我无法测试上面的代码,因为我没有安装旧版本的 gridExtra)
我不想缩小文本,只是想将所有内容收紧在一起,以便表格适合我将其放在 PDF 页面上的位置。
我可以看到“widths”属性在每个条目上都有“+4mm”,但我不知道如何将它们更改为+2mm。
当然,如果有一个我"padding"可以更改的简单属性,我会更愿意。
我的问题与此类似。
我正在尝试使用for循环创建一堆ggplot2图,然后将它们保存在多页pdf文档中,而我遇到了marrangeGrob问题.这是一些示例代码:
Plots <- list()
Plots[[1]] <- qplot(mtcars$mpg, mtcars$wt)
Plots[[2]] <- qplot(mtcars$cyl, mtcars$wt)
Plots[[3]] <- qplot(mtcars$mpg, mtcars$qsec)
Plots[[4]] <- qplot(mtcars$cyl, mtcars$drat)
# install.packages("gridExtra", dependencies = TRUE)
library(gridExtra)
MyPlots <- do.call(marrangeGrob, c(Plots, nrow = 1, ncol = 2))
ggsave("My plots on multiple pages.pdf", MyPlots)
Run Code Online (Sandbox Code Playgroud)
我过去使用过类似版本的do.call(marrangeGrob...线程并让它们工作,但现在,当我尝试执行该行时,我收到此错误:Error: nrow * ncol >= n is not TRUE.类似于以前的代码工作的事实使我认为其中一个包中的某些内容已经更新.对于如何解决这个问题,有任何的建议吗?
我希望在刻面图中添加刻度线。例如,对于这样的分面图:
require(ggplot2)
p <- ggplot(mpg, aes(displ, hwy)) +
geom_point() +
theme_minimal() +
geom_hline(yintercept=10, linetype="solid") +
geom_vline(xintercept=1.0, linetype="solid") +
scale_x_continuous(limits=c(1,8), expand =c(0,0),
breaks = rep(2:7)) +
scale_y_continuous(limits = c(10, 50), expand = c(0,0),
breaks = c(20,30,40)) +
facet_wrap(~cyl) +
theme(panel.margin.x=unit(1.2, "lines"),
panel.margin.y=unit(1.2, "lines"))
p
Run Code Online (Sandbox Code Playgroud)
我希望添加刻度线,使其看起来像这样(请注意,虽然刻度线已添加到所有方面,但刻度标签仅显示在左侧和底部方面):
我试过使用该annotation_custom函数向轴添加线条格子。但是我的尝试不起作用。
require(gridExtra)
require(grid)
x.breaks = rep(2:7)
y.breaks = c(20,30,40)
for (i in 1:length(x.breaks)) {
p = p + annotation_custom(grob = linesGrob(y = unit(c(0, 5), "npc"),
gp=gpar(col= "black")),
xmin = x.breaks[i],
xmax = x.breaks[i],
ymin …Run Code Online (Sandbox Code Playgroud) 我想在多个页面上使用以下layout_matrix布置图。
library(gridExtra)
library(ggplot2)
layout <- rbind(c(1,2,3,4),
c(1,2,3,4),
c(1,2,3,4),
c(5,5,5,5))
p <- list()
for(i in 1:15) {
ifelse(i %% 5 > 0,
p[[i]] <- ggplot(mtcars, aes(wt, mpg)) + geom_point() + ggtitle(paste("plot:",i)),
p[[i]] <- tableGrob(mtcars[5:7,],rows = NULL)
)
}
Run Code Online (Sandbox Code Playgroud)
如果我只有一页:(简单)
grid.arrange(grobs=p[1:5],layout_matrix=layout)
Run Code Online (Sandbox Code Playgroud)
如果我要多个页面:(我松开了所有图案)
marrangeGrob(grobs=p,nrow=4,ncol=2)
Run Code Online (Sandbox Code Playgroud)
有没有办法增加tableGrob项目中列名的单元格?
library(grid)
d <- head(iris, 3)
g <- tableGrob(d)
grid.newpage()
grid.draw(g)
Run Code Online (Sandbox Code Playgroud)
默认:
任何帮助深表感谢。
我有两个与gridExtra::grid.arrange. 我可以用top参数在它们上面加上一个标题。问题是,我被要求在情节的左上角找到标题。
一个可重现的例子:
library(ggplot2)
library(gridExtra)
p1 <- qplot(1:20)
p2 <- qplot(30, 35)
grid.arrange(p1, p2, nrow = 1, top = "Title")
Run Code Online (Sandbox Code Playgroud)
产生
但我需要的是:
我读了好几次?arrangeGrob文件(我认为这是我的答案),但还没有想出如何实现它。
考虑这个例子
library(gridExtra)
library(grid)
d1 <- head(iris[,1:3]) %>% as_tibble()
d2 <- head(iris[,2:5]) %>% as_tibble()
grid.arrange(tableGrob(d1),
tableGrob(d2))
Run Code Online (Sandbox Code Playgroud)
真的很好,但是我缺少数据框的标题!如何将它们自动添加到图片中?
谢谢!