运用 tidyverse
tidyverse
x <- rnorm(100) eps <- rnorm(100,0,.2) df <- data.frame(x, eps) %>% mutate(p1 = 3*x+eps, p2 = 2*x+eps) %>% tidyr::gather("plot", "value", 3:4) %>% ggplot(aes(x = x , y = value))+ geom_point()+geom_smooth()+facet_wrap(~plot, ncol =2) df
ggplot2基于网格图形,它提供了一个不同的系统,用于在页面上排列图形。该 par(mfrow...) 命令没有直接等价物,作为网格对象(称为 grobs )不一定是立即绘制的,但可以在转换为图形输出之前作为常规R对象进行存储和操作。这样可以实现更大的灵活性 现在画这个 基础图形的模型,但战略必然有点不同。
par(mfrow...)
我写 grid.arrange() 提供尽可能接近的简单界面 par(mfrow) 。在最简单的形式中,代码看起来像:
grid.arrange()
par(mfrow)
library(ggplot2) x <- rnorm(100) eps <- rnorm(100,0,.2) p1 <- qplot(x,3*x+eps) p2 <- qplot(x,2*x+eps) library(gridExtra) grid.arrange(p1, p2, ncol = 2)
更多选项详述 这个小插曲 。
一个常见的抱怨是情节不一定是对齐的,例如:当他们有不同大小的轴标签时,这是设计的: grid.arrange 不会尝试使用特殊情况的ggplot2对象,并将它们平等地对待其他grob(例如,格子图)。它只是将凹凸放置在矩形布局中。
grid.arrange
对于ggplot2对象的特殊情况,我写了另一个函数, ggarrange ,具有类似的界面,尝试对齐绘图面板(包括刻面图)并尝试在用户定义时尊重纵横比。
ggarrange
library(egg) ggarrange(p1, p2, ncol = 2)
这两个功能兼容 ggsave() 。有关不同选项和一些历史背景的一般概述, 这个小插图提供了更多信息 。
ggsave()
使用reshape包你可以做这样的事情。
library(ggplot2) wide <- data.frame(x = rnorm(100), eps = rnorm(100, 0, .2)) wide$first <- with(wide, 3 * x + eps) wide$second <- with(wide, 2 * x + eps) long <- melt(wide, id.vars = c("x", "eps")) ggplot(long, aes(x = x, y = value)) + geom_smooth() + geom_point() + facet_grid(.~ variable)
是的,您需要妥善安排数据。一种方法是:
X <- data.frame(x=rep(x,2), y=c(3*x+eps, 2*x+eps), case=rep(c("first","second"), each=100)) qplot(x, y, data=X, facets = . ~ case) + geom_smooth()
我相信在plyr或重塑中有更好的技巧 - 我仍然没有达到速度 在哈德利的所有这些强大的包装上。
使用 拼凑物 包,你可以简单地使用 + 运营商:
+
# install.packages("devtools") devtools::install_github("thomasp85/patchwork") library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) library(patchwork) p1 + p2
还有 multipanelfigure包 值得一提的是。另见 回答 。
library(ggplot2) theme_set(theme_bw()) q1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec)) q4 <- ggplot(mtcars) + geom_bar(aes(carb)) library(magrittr) library(multipanelfigure) figure1 <- multi_panel_figure(columns = 2, rows = 2, panel_label_type = "none") # show the layout figure1
figure1 %<>% fill_panel(q1, column = 1, row = 1) %<>% fill_panel(q2, column = 2, row = 1) %<>% fill_panel(q3, column = 1, row = 2) %<>% fill_panel(q4, column = 2, row = 2) figure1
# complex layout figure2 <- multi_panel_figure(columns = 3, rows = 3, panel_label_type = "upper-roman") figure2
figure2 %<>% fill_panel(q1, column = 1:2, row = 1) %<>% fill_panel(q2, column = 3, row = 1) %<>% fill_panel(q3, column = 1, row = 2) %<>% fill_panel(q4, column = 2:3, row = 2:3) figure2
创建于2018-07-06由 代表包 (v0.2.0.9000)。
如果您想使用循环绘制多个ggplot图,上述解决方案可能效率不高(例如,如下所示: 使用循环在ggplot中创建具有不同Y轴值的多个图 ),这是分析未知(或大)数据集的理想步骤(例如,当您想要绘制数据集中所有变量的计数时)。
下面的代码显示了如何使用上面提到的'multiplot()',其来源如下: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :
plotAllCounts <- function (dt){ plots <- list(); for(i in 1:ncol(dt)) { strX = names(dt)[i] print(sprintf("%i: strX = %s", i, strX)) plots[[i]] <- ggplot(dt) + xlab(strX) + geom_point(aes_string(strX),stat="count") } columnsToPlot <- floor(sqrt(ncol(dt))) multiplot(plotlist = plots, cols = columnsToPlot) }
现在运行该函数 - 获取在一页上使用ggplot打印的所有变量的计数
dt = ggplot2::diamonds plotAllCounts(dt)
需要注意的一点是: 运用 aes(get(strX)) ,在使用时通常会在循环中使用 ggplot ,在上面的代码而不是 aes_string(strX) 不会绘制所需的图。相反,它会多次绘制最后一个情节。我还没弄清楚为什么 - 它可能必须这样做 aes 和 aes_string 被称为 ggplot 。
aes(get(strX))
ggplot
aes_string(strX)
aes
aes_string
否则,希望你会发现这个功能很有用。
您可以使用以下内容 multiplot 功能来自 Winston Chang的R食谱
multiplot
multiplot(plot1, plot2, cols=2)
multiplot <- function(..., plotlist=NULL, cols) { require(grid) # Make a list from the ... arguments and plotlist plots <- c(list(...), plotlist) numPlots = length(plots) # Make the panel plotCols = cols # Number of columns of plots plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols # Set up the page grid.newpage() pushViewport(viewport(layout = grid.layout(plotRows, plotCols))) vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y) # Make each plot, in the correct location for (i in 1:numPlots) { curRow = ceiling(i/plotCols) curCol = (i-1) %% plotCols + 1 print(plots[[i]], vp = vplayout(curRow, curCol )) } }
该 cowplot package以适合发布的方式为您提供了一个很好的方法。
cowplot
x <- rnorm(100) eps <- rnorm(100,0,.2) A = qplot(x,3*x+eps, geom = c("point", "smooth"))+theme_gray() B = qplot(x,2*x+eps, geom = c("point", "smooth"))+theme_gray() cowplot::plot_grid(A, B, labels = c("A", "B"), align = "v")