Plot a legend outside of the plotting area in base graphics?

前端 未结 10 738
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-22 14:48

As the title says: How can I plot a legend outside the plotting area when using base graphics?

I thought about fiddling around with layout

10条回答
  •  清酒与你
    2020-11-22 15:18

    I like to do it like this:

    par(oma=c(0, 0, 0, 5))
    plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2,2))
    lines(1:3, rnorm(3), pch=2, lty=2, type="o")
    legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,
           c("group A", "group B"), pch=c(1, 2), lty=c(1,2))
    

    The only tweaking required is in setting the right margin to be wide enough to accommodate the legend.

    However, this can also be automated:

    dev.off() # to reset the graphics pars to defaults
    par(mar=c(par('mar')[1:3], 0)) # optional, removes extraneous right inner margin space
    plot.new()
    l <- legend(0, 0, bty='n', c("group A", "group B"), 
                plot=FALSE, pch=c(1, 2), lty=c(1, 2))
    # calculate right margin width in ndc
    w <- grconvertX(l$rect$w, to='ndc') - grconvertX(0, to='ndc')
    par(omd=c(0, 1-w, 0, 1))
    plot(1:3, rnorm(3), pch=1, lty=1, type="o", ylim=c(-2, 2))
    lines(1:3, rnorm(3), pch=2, lty=2, type="o")
    legend(par('usr')[2], par('usr')[4], bty='n', xpd=NA,
           c("group A", "group B"), pch=c(1, 2), lty=c(1, 2))
    

提交回复
热议问题