R基础绘图,排列多个图形

3

我正在使用RStudio并尝试使用下面的功能构建一个3x3网格的三角形图。我已经包含了一个可重现的示例,但我遇到的问题是边距太大以至于无法绘制多个图形,即使我缩小了宽度和高度。 我还尝试将它们保存为png格式并加载进来,然后使用cowplot进行排列,但结果非常模糊,我不知道如何调整文本大小或线条粗细以使图形更易读。

 #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)

(这是基于我在此问题中发布的答案构建的,R基础绘图,组合镜像右三角形)

输入图片说明


将RStudio应用程序中的绘图窗口变大(即,不要让它只是微小的右下角)。 - DanY
我已经尝试过了,即使将绘图窗口放大到屏幕的大部分区域,仍然无法绘制第二个图。 - user1757654
1
你需要使用例如 par(mfrow=c(3,3)) 来创建一个 3x3 的图形网格。 - DanY
什么是问题?你收到了错误吗?这里发布的图有什么问题?此外,你的代码并不完全可重现,因为 top.triangle != top.triangle2bottom.triangle != bottom.triangle2,而且仅更改名称是不够的,因为使用了位置参数。请在空的 R 环境中测试代码,并使用 library() 调用指定所有非基本包。 - Parfait
同意@Parfait的观点-如果您想让别人处理您的特定代码,您需要编辑它以便我们可以运行它。例如,您的for循环使用一堆参数调用bottom.triangle(),而上面发布的代码定义了没有参数的函数bottom.traingle2()。我也无法确定x.dist应该是什么,也无法弄清楚您要制作哪9个图(您的for循环只循环3个东西)。此外,除了dplyr之外,是否需要任何库来运行代码? - DanY
1个回答

1
要在指定的链接上使用绘图解决方案,您需要调整包括您计算的列nrm.Sepalnrm.Petaliris数据,在两个函数中。然后,考虑使用by而不是split将子集传递到两个函数进行绘图。但是,该图仅会生成1 X 3。目前尚不清楚如何生成3 X 3。您发布的链接实际上是重复的。 数据
iris$nrm.Sepal <- iris$Sepal.Width / iris$Sepal.Length
iris$nrm.Petal <- iris$Petal.Width / iris$Petal.Length

功能

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)
}

Plot

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)
})

Plot Output


抱歉打错字了,我已经编辑过帖子了。鸢尾花数据集只是一个可行的例子。我只是随便举了个例子来说明。我的数据集比这个图更多类别。我对基础绘图不是很熟悉,看到更多的解决方案会有所帮助。我会多了解一下“by”的用法。 - user1757654
你测试过你的代码了吗?如我在上面评论所述,你不能仅仅修改函数名称并传入函数没有定义的参数。请使用dput提供一份你真实数据的示例以供重现代码。但是,正如此解决方案所示,要将绘图函数调整到数据上。如果有9个组,by可以捕捉它们。 - Parfait

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接