【问题标题】:R base plot, combine mirrored right trianglesR底图,结合镜像直角三角形
【发布时间】:2020-04-23 02:07:42
【问题描述】:

我正在尝试构建一些由 2 个相互镜像排列的直角三角形组成的图形。最终的图将具有唯一的数据集,但现在我正在绘制相同的数据。我更熟悉(可能被宠坏了)ggplot,但我发现在基础 R 中移动轴位置要容易得多。如果有人知道如何在 ggplot 中复制这些直角三角形图,我会接受这个答案!

我在调整间距和布局时遇到问题。我对基础 R 绘图不太熟悉,如果这些有点基础,请见谅。

我特别想:

  • 将三角形靠得更近

  • 使标签可见(并使用不是**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))
    

谢谢!

【问题讨论】:

  • 你是如何得到这张图片的? cowplot 不适用于基本图形。它们应该有多近?如果您将par(mar = ) 设置为0,它们仍然不会那么接近。使用segments(0, 0, 1, 1) 而不是ablinepar(mfrow = c(1, 2))layout 而不是cowplot 腿取决于您的设备尺寸和边距
  • 如果你想让三角形靠得很近,我认为在一个单独的图上绘制比在两个单独的图上绘制要好。
  • with(my.data, { plot(c(my.x, my.y), c(my.y, my.x), asp = 1); segments(0, 0, 1, 1); abline(v = 0:1, h = 0:1) }) 有什么问题

标签: r plot base


【解决方案1】:

正如@GregorThomas 所建议的,最好画一个图。为此,需要一个transformed 附加数据框,它将值移动距离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,我稍微扩展了margins。我使用mtextaxis 来获取标记和标签。为了使对角线与轴齐平,我使用了lines 而不是abline。 bottom.triangle2 现在使用points 而不是plot,因为plot 没有add=TRUE 参数。我在top.triangle2 中使用asp=1 来制作等边三角形。

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

结果

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

【讨论】:

  • 太棒了!这样看起来好多了!感谢您逐步完成并解释您的编辑。
  • 您对在 Rmd 文档中安排这些图的多个版本有什么建议吗?
  • @user1757654 排列这些图的pngs 可能更容易,即将它们创建在一个不可见的块中,并使用cowplot 之类的东西来排列它们。
  • 我一直在使用 png+cowplot,但在调整文本大小和图像分辨率时遇到问题。我正在尝试制作一些 3x3 网格,但我的尝试都是模糊的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 2015-04-30
  • 2016-01-01
  • 1970-01-01
相关资源
最近更新 更多