【问题标题】:Add legend at the top of a plot在绘图顶部添加图例
【发布时间】:2013-06-27 06:37:56
【问题描述】:

我的传说在我的情节中被裁剪了。为了解决这个问题,我知道我必须处理利润,但我不知道如何处理。并且使用 xpd=TRUE 似乎不起作用。

我的代码有这样的结构:

plot(x,y1)
par(new=TRUE)
plot(x,y2)
par(new=TRUE)
plot(x,y3)
...
par(xpd=TRUE)
legend(...)

整个代码:

time<-c(18,19, 21, 25, 26)

layer_0<-c(0.73,0.78,0.95,0.83,0.77)
layer_0_sd<-c(0.04,0.04,0.03,0.13,0.19)

layer_1<-c(0.89,0.9,0.61,0.28,0.08)
layer_1_sd<-c(0.03,0.01,0.14,0.14,0.09)

layer_2<-c(0.66,0.6,0.21,0.01,0)
layer_2_sd<-c(0.06,0,0.12,0.01,0)

layer_3<-c(0.23,0.13,0.05,0,0)
layer_3_sd<-c(0.07,0,0.03,0,0)

layer_4<-c(0.03,0.01,0.01,0,0)
layer_4_sd<-c(0.01,0,0.01,0,0)

layer_5<-c(0,0,0,0,0)
layer_5_sd<-c(0,0,0,0,0)

epsilon=0.02

plot(time, layer_0, ylim=c(0,1), type="o", lty=1, lwd=2,ylab="Longitudinal fCOVER",     xlab="Days after seeding", cex.lab=1.5, cex.axis=1.5, cex.main=1.5, cex.sub=1.5)
segments(time, layer_0-layer_0_sd,time, layer_0+layer_0_sd, lwd=2)
segments(time-epsilon,layer_0-layer_0_sd,time+epsilon,layer_0-layer_0_sd, lwd=2)
segments(time-epsilon,layer_0+layer_0_sd,time+epsilon,layer_0+layer_0_sd, lwd=2)

for (i in c(1:5)){ 
  par(new=TRUE)
  eval(parse(text=paste("plot(time, layer_",i,", ylim=c(0,1), type='o', xlab='',     ylab='', xaxt='n', yaxt='n',lwd=2, lty=",i+1,", col=",i+1,")+
  segments(time, layer_",i,"-layer_",i,"_sd,time, layer_",i,"+layer_",i,"_sd,     col=",i+1,",lwd=2)+
  segments(time-epsilon,layer_",i,"-layer_",i,"_sd,time+epsilon,layer_",i,"-layer_",i,"_sd, col=",i+1,",lwd=2)+
  segments(time-epsilon,layer_",i,"+layer_",i,"_sd,time+epsilon,layer_",i,"+layer_",i,"_sd, col=",i+1,",lwd=2)", sep="")))
}

par(xpd=TRUE)
legend(x=17.65, y=1.3, c("0-5 cm","5-10 cm", "10-15 cm", "15-20 cm", "20-25 cm","25-30 cm"), lty=c(1,2,3,4,5,6), col=c(1,2,3,4,5,6),ncol=3, lwd=2, cex=1.5)

【问题讨论】:

  • 你读过?par吗?请让您的代码可重现,以便我们更容易回答。
  • 我认为阅读?legend 可能会更有帮助,尤其是'inset' 参数。

标签: r plot legend


【解决方案1】:

作为替代方案,使用参数inset 使这变得非常容易。类似的讨论可以在here找到。

你的例子:

par(mar=c(5, 5, 6, 3), xpd=TRUE)

plot(time, layer_0, ylim=c(0,1), type="o", lty=1, lwd=2,ylab="Longitudinal fCOVER",     xlab="Days after seeding", cex.lab=1.5, cex.axis=1.5, cex.main=1.5, cex.sub=1.5)
segments(time, layer_0-layer_0_sd,time, layer_0+layer_0_sd, lwd=2)
segments(time-epsilon,layer_0-layer_0_sd,time+epsilon,layer_0-layer_0_sd, lwd=2)
segments(time-epsilon,layer_0+layer_0_sd,time+epsilon,layer_0+layer_0_sd, lwd=2)

for (i in c(1:5)){ 
  par(new=TRUE)
  eval(parse(text=paste("plot(time, layer_",i,", ylim=c(0,1), type='o', xlab='',     ylab='', xaxt='n', yaxt='n',lwd=2, lty=",i+1,", col=",i+1,")+
  segments(time, layer_",i,"-layer_",i,"_sd,time, layer_",i,"+layer_",i,"_sd,     col=",i+1,",lwd=2)+
  segments(time-epsilon,layer_",i,"-layer_",i,"_sd,time+epsilon,layer_",i,"-layer_",i,"_sd, col=",i+1,",lwd=2)+
  segments(time-epsilon,layer_",i,"+layer_",i,"_sd,time+epsilon,layer_",i,"+layer_",i,"_sd, col=",i+1,",lwd=2)", sep="")))
}

legend("top", inset = c(0, -0.25), legend=c("0-5 cm","5-10 cm", "10-15 cm", "15-20 cm", "20-25 cm","25-30 cm"), lty=c(1,2,3,4,5,6), col=c(1,2,3,4,5,6),ncol=3, lwd=2, cex=1.5)

【讨论】:

    【解决方案2】:

    如果我必须在绘图之外放置图例,我通常会使用单独的面板来完成,因为我发现那时控制位置和大小要容易得多。

    layout(1:2, heights=c(1, 5))
    
    # Legend panel
    par(mar=rep(0,4))
    plot(0, 0, type="n", ann=FALSE, axes=FALSE)
    legend("center", c("5-10 cm", "15-20 cm", "25-30 cm"), horiz=TRUE,
           lty=2:4, col=1:3)
    
    # Plot panel
    par(mar=c(5,4,0,2))
    plot(1:20, cumsum(rnorm(20)))
    

    或者,如果您想遵循您开始使用 par(new=TRUE) 的主题,您可以这样做

    par(mar=c(5,4,5,2))
    plot(1:20, cumsum(rnorm(20)))
    
    par(new=TRUE, mar=c(0,0,1,0))
    plot(0, 0, type="n", ann=FALSE, axes=FALSE)
    legend("top", c("5-10 cm", "15-20 cm", "25-30 cm"), horiz=TRUE,
           lty=2:4, col=1:3)
    

    两者都给出下面的结果。

    【讨论】:

    • 谢谢。我使用第二个选项。就我而言, par(mar=c(5,4,7,2)) 完成了这项工作。
    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多