如何绘制多个图像'和' plot.default'同一设备中的图形?

时间:2014-03-17 07:55:08

标签: r graphics plot spatstat

我有一个功能,它使用spatstat' colourmap函数为绘图生成色阶。 colourmap函数使用image函数绘制色标。这是一个例子:

library(spatstat)

set.seed(1)
dat <- data.frame(x = 1:10, y = 10:1, z = rnorm(10,6,8))

plot_this <- function(x,y,z) {
colpal <- colorRampPalette(c("red", "blue"), bias=1)(20)
colmap <- colourmap(colpal, range = range(z))
layout(matrix(c(1,2), nrow = 1), widths = c(9,1))
par(mar = c(4, 4, 2.5, 1) + 0.1)
plot(x, y, type = "p", bg = colmap(z), pch = 21, cex = 3)
par(mar=c(1,0.5,3,2))
plot(colmap, vertical = TRUE)}

plot_this(dat$x, dat$y, dat$z)

enter image description here

我想并排绘制几个这样的情节,但我的尝试失败了:

par(mfcol = c(1,2))
plot_this(dat$x, dat$y, dat$z)
plot_this(dat$x, dat$y, dat$z)

dev.off()
layout(matrix(c(1,2), nrow = 1))
plot_this(dat$x, dat$y, dat$z)
plot_this(dat$x, dat$y, dat$z)

dev.off()
library(gridExtra)
grid.arrange(grob(plot_this(dat$x, dat$y, dat$z)), grob(plot_this(dat$x, dat$y, dat$z)), ncol = 2)

我找到a tread,Paul Murrell博士说image.plotlayout不相容。但是,我相信这个问题是可以解决的。 如何改进代码以使用layoutpar启用投标?

我想做一些像下面这样的事情,但要分别包括每个情节的色标:

plot_this2 <- function(x,y,z) {
colpal <- colorRampPalette(c("red", "blue"), bias=1)(20)
colmap <- colourmap(colpal, range = range(z))
plot(x, y, type = "p", bg = colmap(z), pch = 21, cex = 3)
}

layout(matrix(c(1,2), nrow = 1))
plot_this2(dat$x, dat$y, dat$z)
plot_this2(dat$x, dat$y, dat$z)

enter image description here

编辑: @IShouldBuyABoat建议调查gridBase。有a nice SO answer混合基础和ggplot图形,但我找不到grid函数的工作组合来制作图。以下是其中一项试验:

library(gridBase)

plot_this <- function(x,y,z) {
plot.new()
colpal <- colorRampPalette(c("red", "blue"), bias=1)(20)
colmap <- colourmap(colpal, range = range(dat$z))
gl <- grid.layout(nrow=1, ncol=2, widths = c(9,1))
vp.1 <- viewport(layout.pos.col=1, layout.pos.row=1) 
vp.2 <- viewport(layout.pos.col=2, layout.pos.row=1) 
pushViewport(viewport(layout=gl))
pushViewport(vp.1)
par(new=TRUE, fig=gridFIG(), mar = c(4, 4, 2.5, 1) + 0.1)
plot(dat$x, dat$y, type = "p", bg = colmap(dat$z), pch = 21, cex = 3)
popViewport(1)
pushViewport(vp.2)
par(new=TRUE, fig=gridFIG(), mar = c(1,0.5,3,2))  
print(plot(colmap, vertical = TRUE))
popViewport(0)}

graphics.off()
plot.new()
gl <- grid.layout(ncol = 2, nrow = 1)
vp.1 <- viewport(layout.pos.col=1, layout.pos.row=1) 
vp.2 <- viewport(layout.pos.col=2, layout.pos.row=1) 
pushViewport(viewport(layout=gl))
pushViewport(vp.1)
plot_this(dat$x, dat$y, dat$z)
popViewport()
pushViewport(vp.2)
par(new=TRUE, fig=gridFIG())
plot_this(dat$x, dat$y, dat$z)
popViewport(1)

1 个答案:

答案 0 :(得分:0)

主要问题是你一次只能使用一种布局控制机制。命令layout与使用par(mfrow)等操作布局不兼容。

解决方案是从函数layout中删除plot_this调用。相反,在plot_this内,首先通过

创建一个基本的绘图坐标系
plot(0,0,xlim=c(0,1), ylim=c(0,1), type="n", axes=FALSE)

然后使用points(...., add=TRUE)添加散点图 并使用plot(..., add=TRUE, xlim, ylim)添加颜色地图,后者是spatstat函数plot.colourmap的调用。