【问题标题】:Aligning or scaling two y axes: Zero values of y1 & y2 should be exactly opposite in R对齐或缩放两个 y 轴:y1 和 y2 的零值在 R 中应完全相反
【发布时间】:2016-04-06 11:52:01
【问题描述】:

加载样本数据并绘图:

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 上的零值彼此相反。

有什么帮助吗?

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

【问题讨论】:

    标签: r plot axis par


    【解决方案1】:

    下面列出的代码应该适用于将两个 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多