在R中复制图

时间:2018-07-08 05:59:43

标签: r replicate

我正在解决我的R在线课程的任务。任务是通过给定X和Y的功能来创建并保存以下pdf文件,并使用Reg(50)和set.seed(1423)对其进行测试:

PDF-Goal-File

第一步是创建基本的Reg()函数,该函数仅创建一个绘图。看起来像这样:

Reg<-function(Anzahl){
  set.seed(1423)
  if(Anzahl<0|!(is.numeric(Anzahl)&&floor(Anzahl)==Anzahl))stop("Schreiben Sie eine positive ganze Zahl")
  X<-runif(Anzahl,min=0,max=20)
  Y<-3-0.2*X+rnorm(Anzahl,0,1)
  model<-lm(Y~X,data=data.frame(X=X,Y=Y))
  object<-paste0("Gleichung: y(x)=",round(coef(model)[[1]],2)," ",round(coef(model)[[2]],2),"*x")
  plot(X,Y,axes=F,xlab=NA,ylab=NA,cex=0.8,pch=24,bg="darkblue",main=paste0("Regressionsanalyse \n",object))
  axis(side=1,at=c(0,5,10,15,20),col=NA,cex.axis=1.2)
  axis(side=2,at=c(seq((min(Y)%%2==T)*min(Y)+floor(min(Y))-1,(max(Y)%%2==T)*max(Y)+ceiling(max(Y))+1,2)),col=NA,las=1,cex.axis=1.2)
  mtext(side=1,"Unabhängige Variable",line=2,cex=1.1)
  mtext(side=2,"Abhängige Variable",line=2,cex=1.1)
  abline(lm(Y~X),col="red",lwd=2)
  grid()
}

任务是使用copy()函数创建9个随机生成的图(如图片中的图),并将它们保存在一个pdf文件中,与图片尽可能相似。为此,在绘图区域内,一个绘图的边距在顶部,底部和左侧为0.5 in,在右侧为0.1 in。

如何使用copy()函数获取输出?

2 个答案:

答案 0 :(得分:1)

WebDataField中的pdf函数可用于切换到pdf文件作为图形上下文。 grDevices可以在同一页面/框架上绘制多个图形,因此par(mfrow = c(nrow,ncol)的图被堆叠在同一框架的nrow * ncol网格中。 nrow x ncol函数用于重复计算表达式。因此,这应该可行:

replicate

一个问题是您要在要调用的函数内设置种子,该种子将生成观测值,拟合模型并创建图。这将导致每次都生成完全相同的观察结果,这可能不是本练习的重点,因为您所附图片中的图在彼此之间略有不同。而是在复制调用之前将种子设置在外面。

> pdf("Regplots.pdf")
> par(mfrow = c(3,3))
> dummy=replicate(9, Reg(50))
> dev.off()
pdf 
  2 
> 

Generated plot in pdf

P.S。对于您附加的图像中的点的颜色,应将> Reg<-function(Anzahl){ + if(Anzahl<0|!(is.numeric(Anzahl)&&floor(Anzahl)==Anzahl))stop("Schreiben Sie eine positive ganze Zahl") + X<-runif(Anzahl,min=0,max=20) + Y<-3-0.2*X+rnorm(Anzahl,0,1) + model<-lm(Y~X,data=data.frame(X=X,Y=Y)) + object<-paste0("Gleichung: y(x)=",round(coef(model)[[1]],2)," ",round(coef(model)[[2]],2),"*x") + plot(X,Y,axes=F,xlab=NA,ylab=NA,cex=0.8,pch=24,bg="darkblue",main=paste0("Regressionsanalyse \n",object)) + axis(side=1,at=c(0,5,10,15,20),col=NA,cex.axis=1.2) + axis(side=2,at=c(seq((min(Y)%%2==T)*min(Y)+floor(min(Y))-1,(max(Y)%%2==T)*max(Y)+ceiling(max(Y))+1,2)),col=NA,las=1,cex.axis=1.2) + mtext(side=1,"Unabhängige Variable",line=2,cex=1.1) + mtext(side=2,"Abhängige Variable",line=2,cex=1.1) + abline(lm(Y~X),col="red",lwd=2) + grid() + } > > pdf("Regplots.pdf") > set.seed(1423) > par(mfrow = c(3,3)) > dummy=replicate(9, Reg(50)) > dev.off() pdf 2 参数设置为bg:出于某种原因,"blue"在pdf文件中会变得太暗。

编辑:来自https://www.statmethods.net/advgraphs/axes.html: “如果要创建自定义轴,则应抑制由高级绘图功能自动生成的轴。选项axis = FALSE抑制x和y轴。xaxt =“ n”和yaxt =“ n”抑制x和y轴。”

您可以使用链接中所述的方法将y轴标签仅固定为偶数。为了设置打印页边距,"darkblue"的参数parmar用于设置文本宽度和英寸的边距(仅提供一个)-作为数字矢量,其顺序为下,左,上是的,但是在这里似乎无法正常工作。

答案 1 :(得分:0)

这是使用ggplot2的一种尝试。

这将生成数据,一个包含9个data.frames的列表。

Anzahl <- 50
X <- runif(Anzahl, min = 0, max = 20)
set.seed(1423)
data <-
  replicate(
    n = 9,
    simplify = FALSE,
    expr = data.frame(X = X,
                      Y = 3 - 0.2 * X + rnorm(Anzahl, 0, 1))
  )

现在,我们绑定data.frames并使用ggplot()。对于回归方程式,我们可以使用stat_poly_eq包中的ggpmisc,有关更多信息,请参见this vignette

library(dplyr) # for the function bind_rows()
library(ggpmisc) # loads ggplot2
bind_rows(data, .id = "id") %>% 
  ggplot(data = ., aes(X, Y)) + 
  geom_point(col = "darkblue") + 
  geom_smooth(method = "lm",
              se = FALSE,
              col = "red") +
  stat_poly_eq(aes(label =  paste(..eq.label..)),
               formula = y ~ x, parse = TRUE,
               label.x.npc = "right") +
  labs(title = "Regressionsanalyse",
       x = "Abhängige Variable",
       y = "Unabhängige Variable") +
  theme_minimal() +
  facet_wrap(~id, ncol = 3)

enter image description here