【问题标题】:Using par(new=T) in loops: different colors?在循环中使用 par(new=T):不同的颜色?
【发布时间】:2021-08-23 05:29:27
【问题描述】:

我想使用par(new = TRUE) 来绘制我的绘图,这些绘图是在另一个循环中生成的。 但是我如何确保每个新情节都有另一种颜色? 现在全是黑色的,被覆盖了,所以我已经无法区分这些情节了:

for(i in names(extensor_raw[2:9])){
  # Coerce a data.frame into an 'emg' object
  x <- as.emg(extensor_raw[i], samplingrate = 1000, units = "mV")  ##do this for every channel
  
  # Compute the rectified signal
  x_rect <- rectification(x)
  
  # Filter the rectified signal
  y <- lowpass(x_rect, cutoff = 100)
  
  # plot the original channel, the filtered channel and the LE-envelope
  plot(y, main = paste("LE-envelope"))
  par(new = TRUE) 
}

我尝试实现以下内容:我尝试包含col = rainbow(9)[i],但这只会给我一个空白图:

plot(y, main = paste("LE-envelope") , col=rainbow(9)[i])
par(new = TRUE) 

根据 cmets 的要求,我使用了dput(y)(不确定位置是否正确:

for(i in names(extensor_raw[2:9])){
  # Coerce a data.frame into an 'emg' object
  x <- as.emg(extensor_raw[i], samplingrate = 1000, units = "mV")  ##do this for every channel
  
  # Compute the rectified signal
  x_rect <- rectification(x)
  
  # Filter the rectified signal
  y <- lowpass(x_rect, cutoff = 50)

  # plot the original channel, the filtered channel and the 
  # LE-envelope
  plot(y, main = paste("LE-envelope extensor") , col=rainbow(9)[i])
  par(new=T) 
}
    
dput(y)

结果如下:

  • 仍有空地

【问题讨论】:

    标签: r loops plot multiple-columns


    【解决方案1】:

    您定义了 for 循环来迭代 names(extensor_raw)。这意味着i 将是每个循环中的一个字符。但是,要定义任何颜色,您需要一个数值。解决方案是迭代一个整数序列:

    seq_along(names(extensor_raw[2:9]))
    # [1] 1 2 3 4 5 6 7 8
    

    这样,col = rainbow(9)[i] 将起作用,例如:

    i <- 5
    rainbow(9)[i]
    # [1] "#00FFAA"
    

    我还修改了代码以使用单个 plot 调用。从那里,我们只需添加带有lines 函数的行。我使用if-else 声明来做到这一点。

    此外,我们需要正确定义y 范围。所以,我们可以这样做:

    y_range <- c(0, max(extensor_raw[2:9]))
    

    然后我们可以在plot 中使用y_range

    完整代码:

    for(i in seq_along(names(extensor_raw[2:9]))) {
      x <- as.emg(extensor_raw[i], samplingrate = 1000, units = "mV")  ##do this for every channel
      x_rect <- rectification(x)
      y <- lowpass(x_rect, cutoff = 100)
    
      if (i == 1) {
        plot(y, main = "LE-envelope", col = rainbow(9)[i], ylim = y_range)
      } else {
        lines(y, col = rainbow(9)[i])
      }
    }
    

    【讨论】:

      【解决方案2】:
      plot(y, main = paste("LE-envelope", i), col=rainbow(9)[i]) 
      

      【讨论】:

      • 您好,感谢您的快速答复。可悲的是,这不起作用,因为我得到一个空白图像,然后根本没有情节,而不是黑色甚至彩虹。我认为这可能与循环的迭代方式有关。但我无法解决问题。
      • 你把括号放错地方了。你写了plot(y, main = paste("LE-envelope", col=rainbow(9)[i])),但应该是plot(y, main = paste("LE-envelope"), col=rainbow(9)[i])
      • 是的,谢谢,我看到我的代码和那个错误我只得到黑色图(因为它指的是标题)我已经将它更正为你的版本,但后来我得到了一个空白图。我在上面的问题中更新了它
      • 运行代码后,y 应该具有它在循环期间的最后一个值,即names(extensor_raw[9] 的值。请运行dput(y) 并将结果粘贴到您的问题中,以便我们进行测试。
      • 感谢您的快速回答,我不确定 dput(y) 应该放在哪里?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多