没有边距的小图 - 边界线宽(lwd)等于1不可见

时间:2013-07-25 00:59:56

标签: r plot border margins

我一直在尝试使用基本绘图功能制作一些非常小的折线图,但在尝试添加细边框时会出现错误。

这是通过Windows 7上的RGui,从绘图窗口中保存一个png。

这是我的代码:

dev.new(width=1.3,height=0.3)
par(mar=c(0,0,0,0))

set.seed(13)
x <- 1:10
y <- runif(10)

plot(x,y,type="n",xaxs="i",yaxs="i",ylim=c(0,1))
polygon( c(1,x,max(x),0), c(0,y,0,0), col="lightblue", border=NA)
lines(x,y,lwd=1)

一切都很好,直到我尝试添加一个行宽为1的方框,给出:

box(lwd=1)

enter image description here

现在我可以通过将线宽增加到2来解决这个问题,但这看起来有点像黑客。

box(lwd=2)

enter image description here

使用像rect这样的rect(1,0,10,1)似乎也没有给我一个合适的解决方案,底边和右边框都不可见。

3 个答案:

答案 0 :(得分:1)

您是否考虑过给予mar一个小的非零值:

dev.new(width=0.3,height=0.3)
par(mar=c(0.01,0.01,0.01,0.01))

set.seed(13)
x <- 1:10
y <- runif(10)

plot(x,y,type="n",xaxs="i",yaxs="i",ylim=c(0,1))
polygon( c(1,x,max(x),0), c(0,y,0,0), col="lightblue", border=NA)
lines(x,y,lwd=1)

box(lwd=1)

我承认我还没有弄清楚最终游戏会是什么,但是当我对这个非常小的屏幕对象进行交互式“拉伸”时,它会产生一个全方位的边界。

enter image description here

我确实认识到我在Mac上并将其保存为pdf文件并将其转换为png文件以进行SO包含可能无法在Linux或Windows设备上精确再现。

答案 1 :(得分:1)

gridgridBase包中的另一个解决方案。我们的想法是将box替换为grid.rect

  1. 使用gridBase获取base视口
  2. 引入一些偏移量(视口y)以显示底线
  3. 缩小视口宽度以显示正确的行。
  4. 这是我的代码:

    library(gridBase)
    sp <- baseViewports()
    vp <- sp$plot
    vp$width <- unit(0.999,'npc')
    vp$y <- unit(0.001,'npc')
    pushViewport(vp)
    grid.rect(gp=gpar(fill=NA))
    upViewport(1)
    

    enter image description here

    编辑感谢@baptiste,您只需使用grid.rect即可获得相同的结果:

    library(grid)
    grid.rect(width = unit(0.999,'npc'),
              y = unit(0.5001, "npc"),
              gp=gpar(fill=NA))
    

答案 2 :(得分:0)

要回答我自己的问题,感谢@ baptiste的提示,由于RGui,这是一个依赖于设备的问题。如果使用png将图像直接保存到文件中,则一切都按预期工作。 E.g:

dev.new(width=1.3,height=0.3)
# repeat from here onwards only for png call below
par(mar=c(0,0,0,0))
set.seed(13)
x <- 1:10
y <- runif(10)
plot(x,y,type="n",xaxs="i",yaxs="i",ylim=c(0,1),bty="n")
polygon( c(1,x,max(x),0), c(0,y,0,0), col="lightblue", border=NA)
lines(x,y,lwd=1)
box(lwd=1)

从“R Graphics”窗口保存到png会显示我原来填充的图像:

enter image description here

使用png直接转到文件,如:

png("textbox_direct.png",width=116,height=27)
# take code block from above
dev.off()

...给出了正确的结果:

enter image description here