r r图例 - 在基本图形中绘制绘图区域外的图例?




5 Answers

也许你需要的是par(xpd=TRUE) ,使事情能够绘制在绘图区域之外。 所以如果你用bty='L'做主要情节,你会在右边留出一些空间来表达传奇。 通常情况下,这将被剪切到绘图区域,但是请执行par(xpd=TRUE)并稍微调整一下,您就可以得到一个图例:

 set.seed(1) # just to get the same random numbers
 par(xpd=FALSE) # this is usually the default

 plot(1:3, rnorm(3), pch = 1, lty = 1, type = "o", ylim=c(-2,2), bty='L')
 # this legend gets clipped:
 legend(2.8,0,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

 # so turn off clipping:
 par(xpd=TRUE)
 legend(2.8,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))
r画图标注 r语言图例位置

正如标题所示: 使用基本图形时,如何在绘图区域外绘制图例?

我想过摆弄layout并产生一个只包含图例的空图,但我会对使用基图设施感兴趣,例如par(mar = )在图的右侧获得一些空间为传奇。

这里是一个例子:

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(1,-1,c("group A", "group B"), pch = c(1,2), lty = c(1,2))

生产:

但如前所述,我希望图例不在绘图区域内(例如,在图形/绘图的右侧。




除了已经提到的ondes(使用layoutpar(xpd=TRUE) )之外,另一个解决方案是用整个设备上的透明图形覆盖您的图,然后将图例添加到该图中。

诀窍是在完整的绘图区域上覆盖一个(空白)图形并添加图例。 我们可以使用par(fig=...)选项。 首先,我们指示R在整个绘图设备上创建一个新的绘图:

par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)

因为我们希望让剧情的内部覆盖整个设备,所以需要设置omamar 。 需要new=TRUE来阻止R启动新设备。 然后我们可以添加空图:

plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')

我们准备添加图例:

legend("bottomright", ...)

将在设备的右下方添加一个图例。 同样,我们可以将图例添加到顶部或右侧边距。 我们唯一需要确保的是原始地块的边缘足够大以容纳传奇。

把所有这些放到一个函数中;

add_legend <- function(...) {
  opar <- par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), 
    mar=c(0, 0, 0, 0), new=TRUE)
  on.exit(par(opar))
  plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
  legend(...)
}

还有一个例子。 首先创建情节,确保底部有足够的空间添加图例:

par(mar = c(5, 4, 1.4, 0.2))
plot(rnorm(50), rnorm(50), col=c("steelblue", "indianred"), pch=20)

然后添加图例

add_legend("topright", legend=c("Foo", "Bar"), pch=20, 
   col=c("steelblue", "indianred"),
   horiz=TRUE, bty='n', cex=0.8)

导致:




我喜欢这样做:

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))

所需的唯一调整是将右边距设置得足够宽以容纳图例。

但是,这也可以是自动的:

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))




我只能提供一个已经指出的布局解决方案的例子。

layout(matrix(c(1,2), nrow = 1), widths = c(0.7, 0.3))
par(mar = c(5, 4, 4, 2) + 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")
par(mar = c(5, 0, 4, 2) + 0.1)
plot(1:3, rnorm(3), pch = 1, lty = 1, ylim=c(-2,2), type = "n", axes = FALSE, ann = FALSE)
legend(1, 1, c("group A", "group B"), pch = c(1,2), lty = c(1,2))




尝试过去使用过的layout() ,只需在下面创建一个空的图,在1/4左右正确缩放,然后手动放置图例部分。

这里有一些关于legend()老问题,应该让你开始。




Related

r plot legend

Tags

r   plot   legend