2016-04-06 20 views
0

Beispieldaten laden und Handlung sein:Aligning oder Skalierung zwei y-Achsen: Nullwerte y1 & y2 sollte genau entgegengesetzt in der 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"))` 

Above Code finden Sie dieses Bild

enter image description here

Woran bin ich fest?

Ich möchte die beiden y-Achsen so ausrichten, dass Nullwerte auf y1 und y2 einander entgegengesetzt sind.

Irgendwelche Hilfe?

Bitte lassen Sie mich wissen, wenn Sie Fragen oder Erläuterungen haben. Vielen Dank!

Antwort

0

Der unten aufgelistete Code sollte zum Ausrichten von Zwei-y-Achsen auf Basislinie funktionieren; Allerdings hat y1 eher seltsame Werte als 0 (in einigen Plots #Remember zeichne ich 80 Zwei-y-Achsen-Plots), dies erfordert eine Anpassung in meinem Algorithmus für die Einstellung des y-Achsenbereichs, aber ansonsten scheinen die Plots (s) in Ordnung zu sein. Lassen Sie es mich wissen, wenn Sie den Grund herausfinden oder eine Klärung haben.

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)