1

我一直在尝试使用基本绘图功能制作一些非常小的折线图,但是在尝试添加细边框时却遇到了问题。

这是通过 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)

在此处输入图像描述

现在我可以通过将线宽增加到 2 来解决这个问题,但这似乎有点 hack。

box(lwd=2)

在此处输入图像描述

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

4

3 回答 3

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)

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

在此处输入图像描述

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

于 2013-07-25T01:11:28.980 回答
1

另一个解决方案基础gridgridBase包装。这个想法是替换boxby grid.rect

  1. 用于gridBase获取base视口
  2. 引入一些偏移量(视口 y )以显示底线
  3. 减小视口的宽度以显示正确的线条。

这是我的代码:

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)

在此处输入图像描述

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

library(grid)
grid.rect(width = unit(0.999,'npc'),
          y = unit(0.5001, "npc"),
          gp=gpar(fill=NA))
于 2013-07-25T01:28:10.833 回答
0

感谢@baptiste 的提示,回答我自己的问题,这是由于 RGui 导致的设备相关问题。如果图像直接保存到文件中,png一切都按预期工作。例如:

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 会给出我原来的填充图像:

在此处输入图像描述

使用如下方式直接进入文件png

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

...给出正确的结果:

在此处输入图像描述

于 2013-07-25T01:49:28.003 回答