R底图,结合镜像右三角图。

问题描述 投票:1回答:1

我正试图建立一些由2个互为镜像的直角三角形组成的数字。最终的图将有独特的数据集,但现在我正在绘制相同的数据。我对ggplot比较熟悉(也许是被ggplot惯坏了),但我发现在基础R中移动轴的位置要容易得多。

我在调整间距和布局方面遇到了麻烦。我对基础R绘图没有那么熟悉,如果这些还挺基础的,对不起。

enter image description here

具体来说,我想

  • 把三角形的距离拉近

  • 使标签可见(并使用顶部标签,而非 **main**)

  • 对角线与轴线齐平。

  • 作等长三角形的'腿'

    library(cowplot)
    my.data <- data.frame( my.x = c(.2,.4,.6, .1), my.y = c(.3, .5, .7, .9) )
    
       top.triangle <- function(){
      plot( my.y ~ my.x, data =  my.data, 
    axes = FALSE, ylab = 'Position.2', xlab = NA, main='Position.1',
    xlim=c(0,1), ylim=c(0,1),  xaxt="n", yaxt="n" )
      axis(side = 2, las = 1, pos=0)
      axis(side = 3, las = 1, pos=1)
      abline(coef = c(0,1))
       }
    
    bottom.triangle <- function() {
      plot( my.x ~ my.y, data = my.data , 
        axes = FALSE, xlab = 'Position.2', ylab = 'Position.1', xlim=c(0,1), ylim=c(0,1),  xaxt="n", yaxt="n" )
      axis(side = 1, las = 1, pos=0)
      axis(4, las = 1, pos=1) #flip label to right side
      abline(coef = c(0,1))}
    
    plot_grid(top.triangle, bottom.triangle, rel_widths = c(.5,.5))
    

谢谢!我正试图建立一些由2个直角三角形组成的图形,它们相互之间排列成镜像。

r plot base
1个回答
1
投票

作为 @GregorThomas 建议,最好是画一个单一的情节。为此,一个 transform需要额外的数据帧,将数值移动一个距离。x.dist.

my.data <- data.frame(my.x=c(.2, .4, .6, .1), my.y=c(.3, .5, .7, .9))
x.dist <- .5
my.data.2 <- transform(my.data, my.y=my.y + x.dist)

现在我已经大幅度修改了你的函数,我建议你逐行弄清楚我用了哪些参数。重要的是我用了 xpd=TRUE 以便能够绘制超出绘图区域的图。有了 par 我扩大了 mar金斯一点点。我用 mtext 连同 axis 来获得刻度线和标签。为了使对角线与轴齐平,我使用了 lines 而不是 abline. 底部的三角形2现在使用 points 而非 plot因为 plot 没有 add=TRUE 争论。而我用的是 asp=1top.triangle2 来做等边三角形。

top.triangle2 <- 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.triangle2 <- 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)
}

我用 png 以获得可重复的输出。

png("myplot.png", width=650, height=500)
op <- par(mar=c(3, 4, 8, 12) + 0.1, oma=c(2, 0, 0, 2))
top.triangle2()
bottom.triangle2()
par(op)
dev.off()

结果

enter image description here

也许你自己想办法避免那么多的硬编码。

© www.soinside.com 2019 - 2024. All rights reserved.