2016-04-06 11 views
0
образца

нагрузки данных и график:Aligning или масштабирования два у оси: нулевые значения y1 и y2 должно быть повернуто в R

x <- 1:5 
y1 <- rnorm(5) 
y2 <- rnorm(5,20) 
par(mar=c(5,4,4,5)+.1) 
plot(x,y1,type="l",col="red") 
par(new=TRUE) 
plot(x, y2,,type="l",col="blue",xaxt="n",yaxt="n",xlab="",ylab="") 
axis(4) 
mtext("y2",side=4,line=3) 
legend("topleft",col=c("red","blue"),lty=1,legend=c("y1","y2"))` 

выше код вам эта картинка

enter image description here

Что я застреваю?

Я хочу выровнять две оси y так, чтобы нулевые значения на y1 и y2 были противоположны друг другу.

Любая помощь?

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или разъяснения. Благодаря!

ответ

0

Ниже приведенный код должен работать для выравнивания двух-оси до базовой линии; однако y1 имеет странные значения, а не 0 (на некоторых графиках #remember я рисую 80 двух-осевых графиков), это потребует корректировки в моем алгоритме для установки диапазона осей оси y, но в противном случае график (ы) выглядит нормально. Дайте мне знать, узнаете ли вы причину или имеете какие-либо разъяснения.

rangeY1=range(df$y1, na.rm=TRUE, finite=TRUE) 

rangeY2=range(df$y2, na.rm=TRUE, finite=TRUE) 

# Scales of the given ranges 
sumY1= rangeY1[2]-rangeY1[1] 
sumY2= rangeY2[2]-rangeY2[1] 
# Relative part of the positive and negative axis, only temporary variables 
R=abs(rangeY1[1]/sumY1) 
S=abs(rangeY2[1]/sumY2) 
K=abs(rangeY1[2]/sumY1) 
L=abs(rangeY2[2]/sumY2) 
#Select new minimum values for the ranges 
if(R>S){ 
    new_miny1=rangeY1[1] 
    new_miny2=sumY2*rangeY1[1]/sumY1 } 
if(S>R){ 
    new_miny1=sumY1*rangeY2[1]/sumY2 
    new_miny2=rangeY2[1] } 
if(S==R){ 
    new_miny1=rangeY1[1] 
    new_miny2=rangeY2[1] } 
#Select new maximum values for the ranges 
if(K>L){ 
    new_maxy1=rangeY1[2] 
    new_maxy2=sumY2*rangeY1[2]/sumY1 } 
if(L>K){ 
    new_maxy1=sumY1*rangeY2[2]/sumY2 
    new_maxy2=rangeY2[2] } 
if(K==L){ 
    new_maxy1=rangeY1[2] 
    new_maxy2=rangeY2[2] } 
#"New ranges" 
new_rangeY1=c(new_miny1, new_maxy1) 
new_rangeY2=c(new_miny2, new_maxy2)