以实际单位绘制 [mm]

Plot in real units [mm]

如何以 R "real" 单位绘图? 我想在 A4 纸上画一个图,实际上 1 个图单位是毫米。 这样的事情可能吗?我还希望能够在 x 和 y 方向上缩放绘图。

通过 R-help 邮件列表,我得到了三个建议;然而,我们最终让一位同事使用 matlab 转换为所需的绘图。 尽管如此,为了将来参考,不同的可能解决方案(不幸的是没有测试):

# Jim Lemon 
in2mm<-25.4 # scale factor to convert inches to mm
pdf("test.pdf",width=8.3,height=11.7)
pin<-par("pin")
plot(c(0,pin[1]*in2mm),c(0,pin[2]*in2mm),
type="n", xaxs="i", yaxs="i")
lines(c(10,10),c(0,10))
text(11,5,"1 cm", adj=0)
lines(c(0,40),c(20,20))
text(20,24,"4 cm")
polygon(c(50,50,70,70),c(50,70,70,50))
text(60,60,"2x2 cm")
dev.off()

# Eik Vettorazzi
postscript("test.ps",paper="a4",horizontal=FALSE)
par(mai=c(1.713,0,1.713,0),xaxs="i",yaxs="i")
plot(0,type="n",xlim=c(0,190),ylim=c(0,190),xlab="",axes=FALSE)
segments(c(0,95),c(95,0),c(190,95),c(95,190))
segments(c(45,95,145,95),c(95,145,95,45),
c(95,145,95,45),c(145,95,45,95))
box()
dev.off()

# Paul Murrell
library(grid)
pushViewport(viewport(width=unit(20, "mm"), height=unit(10, "mm"),
                   xscale=c(0, 20), yscale=c(0, 10)))
grid.rect()
grid.rect(x=unit(3, "mm"), y=unit(2, "mm"),
       just=c("left", "bottom"),
       width=unit(2, "mm"), height=unit(4, "mm"))

在我的同事没有时间在 Autocad 中完成它之后,我修改了 Jim Lemon 的解决方案(用于立面图)。 以下是一个解决方案,它采用 x 和 y 向量,根据提供的比例缩放它们并将绘图居中。当心打印机自动缩放(需要 plottet 1:1)!该示例适用于 A4。

in2mm<-25.4

mx = 1000 # Scale X
my = 2000 # Scale Y 

pdf("test_size.pdf",width=210/in2mm,height=297/in2mm,paper="special")
par(mar= c(5.1,4.1,4.1,1.1))
pin <- par("pin") # returns plotheight and -width

yvalue <- sort(sample(1:1000,200))
xvalue <- sort(sample(1:500,200))

xplus <- diff(range(c(0,pin[1]*in2mm)))*(mx/1000)/2
yplus <- diff(range(c(0,pin[2]*in2mm)))*(my/1000)/2

plot(xvalue,yvalue,#asp=mx/my,
     type="n", xaxs="i", yaxs="i",
     xlim=c(mean(xvalue)-xplus,mean(xvalue)+xplus),
     ylim=c(mean(yvalue)-yplus,mean(yvalue)+yplus),
     ylab="vertical [m]",xlab="horizontal [m]")

lines(xvalue,yvalue,type="l",col="black")

legend(x="topleft",horiz=TRUE,
       legend=c(paste0("Mx: 1:",mx),paste0("My: 1:",my),
                paste0("Vertical Exaggeration: 1:",mx/my)),x.intersp=0,bty="n")

dev.off()