代码之家  ›  专栏  ›  技术社区  ›  Krisselack

以实际单位绘制[mm]

  •  0
  • Krisselack  · 技术社区  · 7 年前

    我怎么能用r“实”单位作图呢? 我想在A4纸上画一个图,其中一个图单位实际上是一毫米。 有可能吗?我也希望能够在X和Y方向缩放绘图。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Krisselack    7 年前

    通过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"))
    
        2
  •  0
  •   Krisselack    7 年前

    在我的同事没有时间在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()