对齐或缩放两个 y 轴:y1 和 y2 的零值在 R 中应该正好相反

Aligning or scaling two y axes: Zero values of y1 & y2 should be exactly opposite in 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"))`

以上代码将你这张图

我卡在什么地方了?

我想对齐两个 y 轴,使 y1 和 y2 上的零值彼此相反。

有什么帮助吗?

如果您有任何问题或需要澄清,请告诉我。谢谢!

下面列出的代码应该可以将两个 y 轴与基线对齐;然而,y1 有奇怪的值而不是 0(在某些图中 #remember 我正在绘制 80 个双 y 轴图),这将需要调整我的算法以设置 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)