2015-09-05 2 views
1

Если я построю данные и использую линии для наложения одних и тех же точек данных на графике, я получаю одинаковые точки данных. Допустим,Искажения на многоканальных участках

 x<-rnorm(100) 
    plot(x, type="p") 
    lines(x, type="p",pch=2) 

Однако я понял, что есть искажение R участков, когда то же самое делается в MultiPanel графике. Кажется, что R не может вспомнить точные значения по оси y при повторной печати одних и тех же данных. Простой код ниже показывает, что выходы из «графика» и «линии» не совпадают.

set.seed(1000) 
    Range<-rbind(rep(0,4),c(100,100,1,100));thres<-70 
    Ylab<-c("MAD","Bias","CP","CIL") 

    X<-list(EVI=cbind(runif(10,0,100),runif(10,0,100), 
    runif(10,0,1),runif(10,0,100)), 
    Qp=cbind(runif(10,0,100),runif(10,0,100),runif(10,0,1),runif(10,0,100))) 


    Plot<-function(x,Pch=1,thres) 
     { 

    par(mfrow=c(1,4),las=2) 
     for(j in 1:4) 
     { 
     plot(x[,j],xaxt = "n",xlab="Estimator", 
     ylab=Ylab[j],type = "p", pch = Pch, ylim=Range[,j]) 
     par(mfg=c(1,j)) 
     axis(1, at=1:nrow(x), labels=LETTERS[1:nrow(x)]) 


     if(j!=3){ 
     par(mfg=c(1,j)) 
     abline(h=thres,col=2) 
     }else{ 
     par(mfg=c(1,j)) 
     abline(h=c(0.90,0.95,0.99),lty=c(2,1,2),col=rep(2,3)) 

     } 
      } 
    } 

    Line<-function(x,Pch) 
     { 
     for(j in 1:ncol(x)) { 
     par(mfg=c(1,j)) 
     lines(x[,j], type = "p", pch = Pch,col=2) 
      } 
     } 


     lapply(X,function(dat)Plot(dat,thres=thres)) 

     ## First panel 
     Line(X$EVI,Pch=2) 

     ## Move to second panel 
     Line(X$Qp,Pch=2) 

Что объясняет искажения в позиционировании точек в третьем столбце? Обратите внимание, что я включил диапазон данных любезности данных @WhiteViking в функцию «Сюжет». Однако искажение продолжает проявляться. Спасибо

+0

Теперь, когда я «Я видел фактический код, который вызвал проблему, я заменил предложенное решение тем, что, на мой взгляд, является лучшим ответом. – WhiteViking

ответ

0

Проблема заключается в упорядочивании «графика» и «линий».

код, как это, со всеми 3 'сюжета' команды авансовыми:

set.seed(1) 
X <- cbind(rnorm(20), 2 * rnorm(20), 3 * rnorm(20)) 

par(mfrow = c(1,3)) 

for (i in 1:3) { 
    plot(X[,i]) 
} 

for (i in 1:3) { 
    par(mfg = c(1,i)) 
    lines(X[,i], type = "p", col = 2, pch = 3) 
} 

дает перекос:

enter image description here

В приведенном выше примере, команды первой 'линии', которые получают выполненную базу его масштабирование на последнем «сюжете», которое произошло. Поскольку у этого был больший вертикальный диапазон, чем первый, масштабирование «линий» неверно.

В то время как структурирована следующим образом:

set.seed(1) 
X <- cbind(rnorm(20), 2 * rnorm(20), 3 * rnorm(20)) 

par(mfrow = c(1,3)) 

for (i in 1:3) { 
    par(mfg = c(1,i)) 
    plot(X[,i]) 
    lines(X[,i], type = "p", col = 2, pch = 3) 
} 

дает правильное выравнивание «сюжета» и «линии»:

enter image description here

Вы, вероятно, придется переделывать свой код для группы ' plot 'и' lines 'вместе для каждого подзаголовка.

+0

Благодарим вас за объяснение. Я занимаюсь имитационным исследованием, и я рисую значения, когда и когда выполняется один прогон. Это не последовательный, как последний пример, который вы дали. Мне, возможно, придется собрать все результаты, а затем последовательно делать графики, а затем каждый «сюжет», за которым следуют «строки». Однако нет ли другого способа добиться правильного масштабирования в искаженном? Я благодарен за прозрение, которое вы дали. –

+0

@RichyMinkah Я не знаю, какое хорошее решение, извините. Но я только любитель R ... Если вы находитесь под давлением времени и просто хотите, чтобы этот единственный график * теперь *, вы можете заставить его работать с действительно уродливым взломом.Масштабируйте данные, переданные «линиям» для третьей панели вверх, чтобы она соответствовала шкале трех других. Итак: строки (x [, j] * ifelse (j == 3,100,1), type = "p", pch = Pch, col = 2) в вашей функции Line. Я подозреваю, что это сработает, но это опасная игра ... – WhiteViking

0

Когда третий столбец преобразуется в проценты, илим становится однородным и, следовательно, нет такого искажения. Тем не менее, неплохо было бы обойти это вместо такого adhoc-преобразования.

0

plot() Создает систему координат через plot.window на основе диапазона данных. Эта информация, по-видимому хранится в par(usr) для последней сюжет, а это значит, что если вы хотите, чтобы вернуться старые участки, вы должны хранить эти USR значения и сбросить их, соответственно,

enter image description here

set.seed(123) 
d1 <- data.frame(x=1:10, y=rnorm(10)) 
d2 <- data.frame(x=1:10, y=10*rnorm(10)) 

par(mfrow=c(1,2),mar=c(2.5,2.5,0,0)) 
plot(d1, type="p") 
usr1 <- par("usr") 
plot(d2, type="p") 
usr2 <- par("usr") 

par(mfg=c(1,1), usr=usr1) 
points(d1, col="red", pch=3) 
par(mfg=c(1,2), usr=usr2) 
points(d2, col="red", pch=3) 
Смежные вопросы