R基础绘图,排列多个绘图
我在RStudio工作,试图用下面的函数构建一个3x3的三角形网格。我已经包括了一个可复制的例子,我遇到的错误是边距太大,无法绘制多个绘图,即使我正在减小宽度和高度。 我也尝试过将它们保存为png并加载到cowplot中,但是图形非常模糊,我不知道如何调整文本大小或线条粗细以使图形更清晰R基础绘图,排列多个绘图,r,plot,R,Plot,我在RStudio工作,试图用下面的函数构建一个3x3的三角形网格。我已经包括了一个可复制的例子,我遇到的错误是边距太大,无法绘制多个绘图,即使我正在减小宽度和高度。 我也尝试过将它们保存为png并加载到cowplot中,但是图形非常模糊,我不知道如何调整文本大小或线条粗细以使图形更清晰 #Data iris$nrm.Sepal <- iris$Sepal.Width / iris$Sepal.Length iris$nrm.Petal <- iris$Petal.Width /
#Data
iris$nrm.Sepal <- iris$Sepal.Width / iris$Sepal.Length
iris$nrm.Petal <- iris$Petal.Width / iris$Petal.Length
df_list <- split(iris, (iris$Species))
top.triangle <- function() {
plot(my.y ~ my.x, data= my.data, axes=FALSE, ylab='', xlab="",
main='', xlim=c(0, 1), ylim=c(0, 1), xaxt="n", yaxt="n", asp=1)
mtext("Here could be your title", 3, 5, font=2, cex=1.3, adj=.95)
mtext("Position.2", 2, .75)
mtext("Position.1", 3, 2)
axis(side=2, las=1, pos=0)
axis(side=3, las=1, pos=1)
lines(0:1, 0:1)
}
bottom.triangle <- function() {
points(my.x ~ my.y, data=my.data.2, xpd=TRUE)
mtext("Position.2", 1, 1.5, at=mean(par()$usr[1:2]) + x.dist)
mtext("Position.1", 4, 3, padj=par()$usr[1] + 10)
x.at <- axisTicks(par()$usr[1:2], 0) + x.dist
axis(side=1, las=1, pos=0, at=x.at,
labels=F, xpd=TRUE)
mtext(seq(0, 1, .2), 1, 0, at=x.at)
axis(4, las=1, pos=1 + x.dist)
lines(0:1 + x.dist, 0:1, xpd=TRUE)
}
#loop for generating species specific plots
for(i in 1:(length(df_list))){
current.strain <- as.character(df_list[[i]]$Species[1])
#declare file for saving png
# png(paste0("~.test.triangle_", current.strain, ".png"), width=650, height=500)
plot.new()
my.data = iris
my.x.top = (iris %>% filter(Species == current.strain) )$nrm.Petal
my.y.top = (iris %>% filter(Species == current.strain) )$nrm.Sepal
my.x.bottom = (iris %>% filter(Species == current.strain) )$nrm.Petal
my.y.bottom = (iris %>% filter(Species == current.strain) )$nrm.Sepal
op <- par(mar=c(3, 2, 2, 2) + 0.1, oma=c(2, 0, 0, 2))
top.triangle(my.y.top, my.x.top, my.data)
bottom.triangle(my.y.bottom+x.dist, my.x.bottom, my.data)
par(op)
RP[[i]] <- recordPlot()
dev.off()
}
#for margins too large error
graphics.off()
par("mar")
par(mar=c(.1,.1,.1,.1))
#draw and arrange the plots
ggdraw() +
draw_plot(RP[[1]], x=0, y=0)
#Add remaining plots
#draw_plot(RP[[2]], x=.25, y=.25)
#draw_plot(RP[[3]], x=.25, y=.25)
#数据
iris$nrm.Sepal要在指定链接使用绘图解决方案,您需要调整到iris数据,包括两个函数中的计算列nrm.Sepal和nrm.Petal。然后,而不是<代码>分裂< /代码>,考虑<>代码> 将子集传递到两个函数中进行绘图。但是,绘图将仅生成1 X 3。目前尚不清楚3x3是如何生成的。你上面贴的链接实际上是重复的
数据
iris$nrm.Sepal <- iris$Sepal.Width / iris$Sepal.Length
iris$nrm.Petal <- iris$Petal.Width / iris$Petal.Length
将RStudio应用程序中的绘图窗口放大(即,不要让它只是小的右下角)我已经尝试过了,即使绘图窗口放大到屏幕的大部分,我也无法绘制第二个绘图。您需要使用,例如,par(mfrow=c(3,3))
来生成3x3的绘图网格。问题是什么?你收到错误了吗?张贴在这里的情节有什么问题?此外,您的代码不能完全复制为top.triangle!=顶部.triangle2
和底部.triangle!=由于使用了位置参数,因此仅更改底部.triangle2
和名称是不够的。在空的R环境中测试代码。请使用library()
调用指定所有非基本包。同意@Parfait-如果您希望有人处理您的特定代码,您需要编辑它,以便我们可以运行它。例如,For循环使用一组参数调用bottom.triangle(),而上面发布的代码定义的函数bottom.traingle2()没有参数。我也不知道x.dist应该是什么,也不知道你想画9个图(你的for循环只在3个东西上循环)。另外,是否有运行代码所需的库(dplyr除外)?对不起,我编辑了这篇文章。iris数据集只是一个可行的例子。我只是把这个数字加起来作为例子。我的这个数字的数据集有更多的类别。我不太熟悉基本绘图,它有助于看到更多的解决方案。我会读更多关于“by”的内容。你测试过你的代码吗?正如我在上面所评论的,在传入函数未定义的参数时,不能简单地重命名函数。请dput
您的实际数据样本以供参考。但由于此解决方案显示了针对数据的定制绘图函数。如果您有9个组,by
将捕获它们。
top.triangle <- function(my.data) {
plot(nrm.Sepal ~ nrm.Petal, data= my.data, axes=FALSE, ylab="", xlab="",
main='', xlim=c(0, 1), ylim=c(0, 1), xaxt="n", yaxt="n", asp=1)
mtext(my.data$Species[[1]], 3, 5, font=2, cex=1.3, adj=.95)
mtext("Position.2", 2, .75)
mtext("Position.1", 3, 2)
axis(side=2, las=1, pos=0)
axis(side=3, las=1, pos=1)
lines(0:1, 0:1)
}
bottom.triangle <- function(my.data) {
x.dist <- .5
my.data.2 <- transform(my.data, nrm.Sepal=nrm.Sepal + x.dist)
points(nrm.Petal ~ nrm.Sepal, data=my.data.2, col="red", xpd=TRUE)
mtext("Position.2", 1, 1.5, at=mean(par()$usr[1:2]) + x.dist)
mtext("Position.1", 4, 3, padj=par()$usr[1] + 3)
x.at <- axisTicks(par()$usr[1:2], 0) + x.dist
axis(side=1, las=1, pos=0, at=x.at,
labels=FALSE, xpd=TRUE)
mtext(seq(0, 1, 0.2), 1, 0, at=x.at, cex=0.7)
axis(4, las=1, pos=1 + x.dist)
lines(0:1 + x.dist, 0:1, xpd=TRUE)
}
par(mar=c(1, 4, 8, 6), oma=c(2, 0, 0, 2), mfrow=c(2,3))
by(iris, iris$Species, function(sub){
top.triangle(sub)
bottom.triangle(sub)
})