2017-09-16 1 views
0

split.screen 옵션을 사용하여 여러 개의 그림을 생성하려고하는데이 페이지에 7 개의 그림이 있어야합니다. 그 중 하나는 자체적으로 플롯되어야하고 다른 루프는 for 루프를 사용하여 반복적으로 플롯됩니다.split.screen을 사용하여 그림 여백 조정

이것은 내가 수행중인 일부 시뮬레이션을위한 코드입니다. 그것은 잘 실행,하지만 난이 잠재적 인 문제를 가지고

  1. 내가 더 큰 음모에 표시하기 위해 할당 된 레이블을 얻을 수 있기 때문에 플롯의 실제로 그려 도착하는 모르겠습니다.
  2. 화면 1에 표시된 플롯은 실제 데이터가 아니며 별도로 플롯하고 모양이 무엇인지 알았 기 때문에 실제 데이터가 아닙니다.

데이터를 시뮬레이션 :

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) 

플로팅 :

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() 

결과 : 내가하려고 많은 시간을 보냈습니다

output

도이를 파악하기같은 다른 패키지와 함께. 감사!

답변

0

플롯 될 것으로 예상되는 내용은 다음과 같습니다.

> 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 

도움말 파일에 설명 된대로 : 당신은 화면을 분할 할 때, 당신은 당신의 콘솔에서 다음을 입수했습니다해야

plot

(나는 그림에 대한 작은 플롯에 화면 제목을 추가) ?split.screen, 이것은 새로 생성 된 화면의 화면 번호 벡터입니다. 따라서 유효한 화면 번호는 1 (이미 플롯되어 있음)이고 3-8 (6 개의 작은 화면)입니다.

이와 같이 화면 3-8보다는 화면 1-8을 반복하므로 다음 줄이 예상대로 작동하지 않습니다.

# instead of 
for(i in 1:8) ## 8=#of screens 

# use this 
for(i in 3:8) ## 8=#of screens 

참고로 중첩 루프에는 다른 루프 카운터도 사용해야합니다. 외부 루프 (6 개의 작은 플롯의 경우)는 루프 카운터로 i을 사용했습니다. 이 루프 내에서 표현형에 대한 또 다른 루프가 있으며, 이는 i을 사용합니다. 화면 선택은 각 외부 루프 반복의 시작에서 수행 되었기 때문에이 코드는 여전히이 경우에도 작동했지만 일반적으로 루프 카운터를 별도로 유지하는 것이 가장 좋습니다.

+0

제발, 실제로 어떤 그림이 플로팅 중인지 보여주는 화면 제목을 어떻게 추가했는지 알고 싶습니다. – Maryam

+0

나는 그것을 지금 고쳤다. 동일한 루프 카운터가 사용 되었기 때문에 표시되지 않았지만 이제는 변경 했으므로 잘 작동합니다. 정말 고마워! – Maryam

+0

@Maryam 각 루프의 'plot()'호출에'main = paste ("Screen", i)'를 추가하여 각 작은 플롯에 화면 번호를 표시 할 수 있습니다. 예 :'plot (PC_EPS $ x, col = c (rep ("red", f * Nums), rep ("blue", f * Nums), 메인 = paste ("Screen", i))' –