使用split.screen调整图边距

时间:2017-09-16 03:12:38

标签: r plot

我正在尝试使用{ "name": "my-desktop-git-project", "version": "1.0.0", "description": "Alex's Desktop Git Project" } 选项生成多个图,我需要在页面上有7个图。其中一个应该自己绘制,另外6个使用for循环重复绘制。

这是我正在执行的一些模拟的代码。它运行良好,但我有两个潜在的问题:

  1. 我不确定哪些地块实际上被绘制了,因为我无法将指定的标签显示在更大的地块上。
  2. 屏幕1上显示的图表不是实际数据,因为我已单独绘制它并知道它应该是什么样子。
  3. 模拟数据:

    split.screen

    绘图:

    numpop = 2
    N = 1250
    nSNP = 5000
    Fst = 0.001
    omega = c(0.5, 0.5) 
    propnExtreme = 0.1
    nsim = 10
    Fst.obs = vector(length = nSNP)
    pdiffs = vector(length = nSNP)
    genomat = matrix(nrow = N, ncol = nSNP)
    
    for (i in 1:nSNP){
      p = runif(1, 0.1, 0.9)
      alpha = p * (1 - Fst) / Fst
      beta = (1 - p) * (1 - Fst) / Fst
      ps = rbeta(numpop, shape1 = alpha, shape2 = beta)
      vars = var(ps)
      pdiffs[i] = max(ps) - min(ps)
      Fst.obs[i] = vars / (p * (1 - p))
    
      for (j in 1:numpop){
        ind1 = (j-1) * N * omega[j] + 1
        ind2 = j * N * omega[j]
        freqs = c(ps[j]^2, 2 * ps[j] * (1 - ps[j]), (1 - ps[j])^2)
        genomat[ind1:ind2, i] = sample(c(0, 1, 2), size = N*omega[j], replace = TRUE, prob = freqs)
    
      }
    
    }
    snpmeans = colMeans(genomat)
    pi = (1 + colSums(genomat)) / (2 + 2*nrow(genomat))
    stdmat = scale(genomat, center=snpmeans, scale=sqrt(pi*(1-pi)))
    pr = prcomp(stdmat, center=F, scale=F)
    

    结果:

    output

    即使使用get( getOption("device" ) )() png(file="myplot.png", width=2000, height = 1200) par(oma = c(0,0,3,0)) split.screen(c(1,2)) # split display into two screens plot(pr$x, col = c(rep("red", N*omega[1]), rep("blue", N*omega[2])), main = "Whole genotype data") split.screen(c(2, 3), screen = 2) # now split the second into 2x3 for(i in 1:8) ## 8=#of screens { screen(i) # prepare screen i for output fA=0.5 fa = 1-fA combined_SNP <- sample(c(0:2), N, prob=c(fA^2, 2*fA*fa, fa^2), replace=T) pheno_indep <-c() ##Phenotypes for (i in 1:length(combined_SNP)){ if (combined_SNP[i] == '0') { pheno_indep<- c(pheno_indep, rnorm(1, mean = 0.07, sd = 1)) } else if (combined_SNP[i ]== '1') { pheno_indep <- c(pheno_indep, rnorm(1, mean = 0, sd = 1)) } else { pheno_indep <- c(pheno_indep, rnorm(1, mean = -0.07, sd = 1)) } } l <- 1:N combined_indep <- cbind(combined_SNP, pheno_indep, l) sorted_combined <- combined_indep[order(combined_indep[, 2]), ] ##eps data f = 0.1 Nums = nrow(sorted_combined) keep <- c(1:(f*Nums), (Nums-(f*Nums)+1):Nums) epsdat<- c(rep("0", f*Nums), rep("1", f*Nums)) EPS_dat <- as.factor(cbind(sorted_combined[keep, ], epsdat)) dim(EPS_dat) <- c(length(keep), 4) #colnames(EPS_dat) <- c("Genotypes", "Phenotypes", "ID", "position") PC_EPS <- prcomp((genomat[EPS_dat[, 3], ])) plot(PC_EPS$x, col=c(rep("red", f*Nums), rep("blue", f*Nums))) } close.screen(all=TRUE) dev.off() 等其他软件包,我也花了很多时间来解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:0)

以下是您希望绘制的内容吗? (我为小图添加了屏幕标题以供说明)

plot

分割屏幕时,您应该在控制台上获得以下内容:

data

如帮助文件> split.screen(c(1, 2)) [1] 1 2 # (code used to plot first chart on the left) > split.screen(c(2, 3), screen = 2) [1] 3 4 5 6 7 8 中所述,这是新创建的屏幕的屏幕编号向量。因此,您的有效屏幕编号为1(已绘制)和3-8(6个小屏幕)。

因此,下一行无法按预期工作,因为您现在正在遍历1-8屏幕而非3-8屏幕。

?split.screen

作为旁注,您还应该为嵌套循环使用不同的循环计数器。您的外部循环(对于6个小图)使用# instead of for(i in 1:8) ## 8=#of screens # use this for(i in 3:8) ## 8=#of screens 作为循环计数器。在这个循环中,你有另一个表型循环,它也使用了i。由于屏幕选择是在每个外部循环迭代开始时完成的,因此代码在这种情况下仍然有用,但一般情况下,最好将循环计数器分开。