以实际单位绘制[mm]

时间:2018-05-30 14:06:57

标签: r plot units-of-measurement

我如何在R“真实”单位中绘图? 我想在A4纸上绘制一个图,其中1个绘图单位实际上是mm。 有可能吗?我还希望能够在x和y方向上缩放图。

2 个答案:

答案 0 :(得分:1)

通过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"))

答案 1 :(得分:0)

在我的同事不再有时间在Autocad中进行此操作之后,我开始考虑Jim Lemon的解决方案(用于标高图)。 以下是一个采用x和y向量的解决方案,根据提供的比例对它们进行缩放并将图居中。当心打印机的自动缩放(需要以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()