【问题标题】:Plot time series and image in R so that x axis labels line up perfectly在 R 中绘制时间序列和图像,以便 x 轴标签完美对齐
【发布时间】:2012-08-27 17:01:41
【问题描述】:

我正在尝试用 R 中的相应频谱图绘制时间序列(地震仪)。 由于我想将时间序列与频谱图进行比较,因此时间序列上的 X 轴标签需要与频谱图上的 X 轴标签对齐。但是,我在这方面遇到了很多麻烦。到目前为止我能做的最好的就是使用

par(mar=c(0,10,0,8))

并尝试通过调整频谱图边距手动强制频谱图标签与时间序列标签对齐。当然,这只是近似值,它们仍然不能完美排列。有没有办法让下面代码生成的坐标轴相互匹配?

par(mfcol=c(2,1))
plot(seq_len(1000)*0.01, sin(2*pi*seq_len(1000)*0.01), type="l",xlab="Time",
ylab="Amplitude", main="Time Series", xlim=c(1,10))
image(seq_len(1000)*0.01,seq_len(100)*0.1,array(runif(1000000),dim=c(1000,100)),
xlab="Time", ylab="Frequency", main="Spectrogram", xlim=c(1,10))

提前致谢!

【问题讨论】:

  • 你试过rasterImage 吗?将图像的角设置到当前定义的绘图空间需要四个参数(基于现有的 x 和 y 比例)。

标签: image r plot


【解决方案1】:

这似乎有效:

par(mfcol=c(2,1))
plot(seq_len(1000)*0.01, sin(2*pi*seq_len(1000)*0.01), type="l", xaxs="i")
image(seq_len(1000)*0.01,seq_len(100)*0.1,array(runif(1000000),dim=c(1000,100)),
    xlab="Time", ylab="Frequency", main="Spectrogram")

只需删除 xlim= 参数并在 plot() 函数中使用 xaxs="i" 来匹配 image() 的默认值。

【讨论】:

    【解决方案2】:

    您可以将xaxs='i' 添加到对plot 的调用中(这会删除额外的填充,使其与图像图对齐),或者您可以在第一个图之后使用par('usr') 来查看x 限制是并在图像中的xlim 调用中使用这些值。

    【讨论】:

      【解决方案3】:

      事实证明,这比最初看起来要容易得多。秘诀是制作一个“虚拟情节”,然后将图像添加到情节中。下面是新的工作代码的外观:

      par(mfcol=c(2,1))
      plot(seq_len(1000)*0.01, sin(2*pi*seq_len(1000)*0.01),
      type="l",xlab="Time",ylab="Amplitude", main="Time Series")
      plot(c(0,10), c(0,10), type="n") #Dummy plot with axis limits for our spectrogram
      image(seq_len(1000)*0.01,seq_len(100)*0.1,array(runif(1000000),dim=c(1000,100)),
      xlab="Time", ylab="Frequency", main="Spectrogram",add=TRUE)
      

      【讨论】:

      • 很高兴知道这适用于 image 以及 rasterImage 根据我之前的评论!
      【解决方案4】:

      与 Greg Snow 的回答类似,但相反,您可以将 xaxs='r' 添加到对 image 的调用中,如下所示:

      par(mar=c(0,10,0,8))
      par(mfcol=c(2,1))
      plot(seq_len(1000)*0.01, sin(2*pi*seq_len(1000)*0.01), type="l",xlab="Time",
           ylab="Amplitude", main="Time Series", xlim=c(1,10))
      image(seq_len(1000)*0.01,seq_len(100)*0.1,array(runif(1000000),dim=c(1000,100)),
            xlab="Time", ylab="Frequency", main="Spectrogram", xlim=c(1,10), xaxs="r")
      

      别忘了先保存你的 par() 设置。

      (也许我应该把它放在上面)

      【讨论】:

        猜你喜欢
        • 2017-01-17
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多