【问题标题】:Invalid xlim value when plotting multiple graphs绘制多个图形时 xlim 值无效
【发布时间】:2017-11-28 17:51:18
【问题描述】:

我试图在一个窗口中绘制三个单独的图表。在每个图表中,我绘制 4 个折线图。

我正在尝试在我的图中添加一个图例,当我添加它时,R 在 plot.window(...) 中抛出一个 xlim 错误

我已经注释掉了图例部分,代码运行正常,但显然没有图例。

这个错误是否与使用 par(mfrow=c(x,y)) 修改图形参数有关??

我的代码如下:

#Three plots representing each of the sectors and technologies for DO0182
op <- par(no.readonly = TRUE)
par(oma=c(3,3,0,0),mar=c(3,3,2,2),mfrow =c(3,1))

plot(wideRawDF$Period.Start.Time,wideRawDF$DO0182U09A3,
     ylab="",
     xlab="",
     type="l",
     col = "red",
     lwd = 1,
     ylim = c(-107, -80),
     main = "Sector A",
     legend(x="topleft",
            ncol = 4,
            legend = c("F0 - U900MHz",
                       "F1 - U2100MHz",
                       "F2 - U2100MHz",
                       "F3 - U2100MHz"),
            fill = c("red","cyan","magenta","black"),
            title = "Frequency Bands"))
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21A1 , col = "cyan")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21A2 , col = "magenta")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21A3 , col = "black")

plot(wideRawDF$Period.Start.Time,wideRawDF$DO0182U09B3,ylab="",xlab="",type="l",col = "red", lwd = 1, ylim = c(-107, -70), main = "Sector B")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21B1 , col = "cyan")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21B2 , col = "magenta")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21B3 , col = "black")

plot(wideRawDF$Period.Start.Time,wideRawDF$DO0182U09C3,ylab="",xlab="",type="l",col = "red", lwd = 1, ylim = c(-107, -80), main = "Sector C")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21C1 , col = "cyan")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21C2 , col = "magenta")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21C3 , col = "black")

我希望先让图例在第一个子图上运行,然后我可以在它运行时更新其余代码,所以请原谅代码的不完整。

当我在第一个绘图函数中注释掉 legend 参数时,代码运行时没有提到错误,但包含它时会引发 xlim 错误。

如何进一步解决此错误,我不知道 xlim 被破坏了什么?会不会和顶部的 par/mfrow 部分有关?

用最新的情节更新了下面的代码

op <- par(no.readonly = TRUE)
par(oma=c(2,2,0,13),mar=c(3,3,2,2),mfrow =c(3,1))
box("outer", lty="solid", col="green")
box("inner", lty="dotted", col="green")

plot(wideRawDF$Period.Start.Time,wideRawDF$DO0182U09A3,
     ylab="",
     xlab="",
     type="l",
     col = "#e41a1c",
     lwd = 1,
     ylim = c(-107, -80),
     main = "Sector A")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21A1 , col = "#377eb8")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21A2 , col = "#4daf4a")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21A3 , col = "#984ea3")

par(xpd=NA)
legend(x=-3,
       y= 7,
       inset = 0,
       ncol = 1,
       legend = c("F0 - U900MHz",
                  "F1 - U2100MHz",
                  "F2 - U2100MHz",
                  "F3 - U2100MHz"),
       fill = c("#e41a1c","#377eb8","#4daf4a","#984ea3"),
       title = "Frequency Bands")
box("outer", lty="solid", col="green")
box("inner", lty="dotted", col="green")

plot(wideRawDF$Period.Start.Time,wideRawDF$DO0182U09B3,
     ylab="",
     xlab="",
     type="l",
     col = "#e41a1c", 
     lwd = 1, 
     ylim = c(-107, -70), 
     main = "Sector B")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21B1 , col = "#377eb8")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21B2 , col = "#4daf4a")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21B3 , col = "#984ea3")

plot(wideRawDF$Period.Start.Time,wideRawDF$DO0182U09C3,
     ylab="",
     xlab="",
     type="l",
     col = "#e41a1c",
     lwd = 1, 
     ylim = c(-107, -80), 
     main = "Sector C")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21C1 , col = "#377eb8")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21C2 , col = "#4daf4a")
lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21C3 , col = "#984ea3")


mtext(text="Time",side=1,line=0,outer=TRUE)
mtext(text="Received Total Wideband Power (dBm)",side=2,line=0,outer=TRUE)

【问题讨论】:

    标签: r plot


    【解决方案1】:

    问题不在于xlim,而是在plot() 函数内部传递legend。这对我很有效:

    op <- par(no.readonly = TRUE)
    par(oma=c(3,3,0,0),mar=c(3,3,2,2),mfrow =c(3,1))
    
    plot(wideRawDF$Period.Start.Time,wideRawDF$DO0182U09A3,
         ylab="",
         xlab="",
         type="l",
         col = "red",
         lwd = 1,
         ylim = c(-107, -80),
         main = "Sector A")
    
    legend(x="topleft",
           ncol = 4,
           legend = c("F0 - U900MHz",
                      "F1 - U2100MHz",
                      "F2 - U2100MHz",
                      "F3 - U2100MHz"),
           fill = c("red","cyan","magenta","black"),
           title = "Frequency Bands")
    
    lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21A1 , col = "cyan")
    lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21A2 , col = "magenta")
    lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21A3 , col = "black")
    
    plot(wideRawDF$Period.Start.Time,wideRawDF$DO0182U09B3,ylab="",xlab="",type="l",col = "red", lwd = 1, ylim = c(-107, -70), main = "Sector B")
    lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21B1 , col = "cyan")
    lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21B2 , col = "magenta")
    lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21B3 , col = "black")
    
    plot(wideRawDF$Period.Start.Time,wideRawDF$DO0182U09C3,ylab="",xlab="",type="l",col = "red", lwd = 1, ylim = c(-107, -80), main = "Sector C")
    lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21C1 , col = "cyan")
    lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21C2 , col = "magenta")
    lines(wideRawDF$Period.Start.Time,wideRawDF$DO0182U21C3 , col = "black")
    

    编辑:

    要在绘图区域下方和外部显示常见图例,请使用:

    par(xpd=T)
    legend(ymd_hms("2017-01-20 16:30:00"), -112,
           ncol = 4,
           legend = c("F0 - U900MHz",
                      "F1 - U2100MHz",
                      "F2 - U2100MHz",
                      "F3 - U2100MHz"),
           fill = c("red","cyan","magenta","black"),
           title = "Frequency Bands").
    

    您可能需要调整 oma/mar 值或 x 和 y

    【讨论】:

    • 哇,你着火了,再次感谢。由于图例对所有三个图都是通用的,我如何将图例放在单个列中 3 个图的最底部甚至右侧?我读过 xpd 必须设置为 TRUE 才能在绘图本身之外绘图,或者我可以将 x 值单独指定为“底部”,或者我可以同时指定 X 和 Y 坐标。当我将 X 指定为“底部”时,它会将其放到第三个图的底部。当我指定 X 和 Y 时,图例完全消失了。
    • 感谢 Ed 进行上述编辑,最初我不确定您为什么包含 ymd_hms(X 轴)和 -112,但我知道图例 X Y 点使用这些图例的扩展。我通过使用 par("usr") 发现了这一点。使用它我可以看到我的 X 轴使用的是 Epoch 刻度,因此使用了 ymd_hms。感谢您的耐心等待。
    猜你喜欢
    • 2014-03-06
    • 2018-01-26
    • 1970-01-01
    • 2020-07-22
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多