我正在尝试在RStudio中制作2个面板图。通常足够简单:
par(mfrow=c(1,2)) #1*2 plotting window
但是,当我使用car包中的
scatterplot()
函数进行绘图时,似乎会覆盖绘图窗口的此划分。可重现的示例:
我要寻找的格式可以通过以下方式产生:
par(mfrow=c(1,2))
plot(iris$Sepal.Length,iris$Sepal.Width)
plot(iris$Petal.Width,iris$Sepal.Width)
但是出于某些原因,我想使用
scatterplot()
。但是,当我再次尝试相同的格式设置技巧时,它不起作用。试试这个块:library(car)
par(mfrow=c(1,2))
scatterplot(Sepal.Length~Sepal.Width|Species,data=iris,grid="FALSE", boxplots="", reg.line="FALSE",pch=c(0,1,2))
scatterplot(Petal.Width~Sepal.Width|Species,data=iris,grid="FALSE", boxplots="", reg.line="FALSE",pch=c(0,1,2))
有谁知道解决方法?
我还尝试了以下替代结构:
m<-rbind(c(1,2))
layout(m)
没运气。
更新此问题很大程度上是this one的重复,除了我正在寻找解决方法,而不是该页面上剩余的响应,该响应基本上只是承认scatterplot()实际上覆盖了par(mfrow)
最佳答案
您可以使用块参数rmarkdown
在fig.show='hold'
文档中并排输出图形。另一种选择是使用ggplot2
而不是cars
scatterplot
函数来创建绘图。我在下面显示两种方法。cars::scatterplot
文档中的并排rmarkdown
图
以下是带有PDF输出的示例。 out.width='3in'
设置输出文档中每个图的实际大小,而与fig.height
和fig.width
无关。但是您仍然可以调整fig.height
和fig.width
来调整相对于绘图区域的纵横比和文本大小。
---
title: "Untitled"
author: "eipi10"
date: "November 23, 2016"
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r fig.show='hold', out.width='3in', fig.height=5, fig.width=5}
library(car)
scatterplot(Sepal.Length~Sepal.Width|Species,data=iris,grid="FALSE",
boxplots="", reg.line="FALSE", pch=c(0,1,2))
scatterplot(Petal.Width~Sepal.Width|Species,data=iris,grid="FALSE",
boxplots="", reg.line="FALSE", pch=c(0,1,2))
```
使用
ggplot2
的并排散点图如果您愿意使用
ggplot2
,则可以相对容易地获得两图布局:library(ggplot2)
library(gridExtra)
theme_set(theme_bw())
grid.arrange(
ggplot(iris, aes(Sepal.Width, Sepal.Length, colour=Species)) +
geom_point() +
geom_smooth(alpha=0.2) +
theme(legend.position="top"),
ggplot(iris, aes(Sepal.Width, Petal.Width, colour=Species)) +
geom_point() +
geom_smooth(alpha=0.2) +
theme(legend.position="top"),
ncol=2)
自定义
ggplot2
图使其更像cars::scatterplot
输出您可以通过其他方式自定义上面的代码。如果您不希望置信带,请将
se=FALSE
添加到geom_smooth
。如果您希望每种物种使用不同的形状,请将aes(shape=Species)
添加到geom_point
。如果要在基础图形中使用特定的形状,请添加+ scale_shape_manual(values=0:2)
等。还可以通过一些额外的工作获得单个图例。在下面的代码中,我添加了这些自定义设置和其他自定义设置,以更接近原始基本图形的方式重现内容。
# Components we'll reuse for both plots
my_theme = list(geom_point(aes(shape=Species)),
geom_smooth(se=FALSE, show.legend=FALSE, lwd=0.8),
scale_shape_manual(values=0:2),
scale_colour_manual(values=c("black", "red","green")),
theme_bw(),
theme(panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
legend.position="top"))
p1 = ggplot(iris, aes(Sepal.Width, Sepal.Length, colour=Species)) +
my_theme +
labs(x="Sepal Width", y="Sepal Length") +
scale_y_continuous(limits=c(3,8)) +
scale_x_continuous(limits=c(1,5))
p2 = ggplot(iris, aes(Sepal.Width, Petal.Width, colour=Species)) +
my_theme +
labs(x="Sepal Width", y="Petal Width")
# Function to extract legend
# https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs
g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}
leg = g_legend(p1)
grid.arrange(leg,
arrangeGrob(grobs=lapply(list(p1,p2), function(p) p + guides(colour=FALSE, shape=FALSE)), ncol=2),
ncol=1, heights=c(1,10))