首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否在基础图形中的绘图区域之外绘制图例?

是否在基础图形中的绘图区域之外绘制图例?
EN

Stack Overflow用户
提问于 2010-10-14 18:01:44
回答 10查看 391.9K关注 0票数 207

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

我想过摆弄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))

产生:

但如上所述,我希望图例位于绘图区域之外(例如,在图形/绘图的右侧)。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-10-14 19:15:47

也许您需要的是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))
票数 126
EN

Stack Overflow用户

发布于 2012-05-10 13:36:05

没有人提到对legend使用负的inset值。下面是一个示例,其中图例位于绘图的右侧,与顶部对齐(使用关键字"topright")。

# Random data to plot:
A <- data.frame(x=rnorm(100, 20, 2), y=rnorm(100, 20, 2))
B <- data.frame(x=rnorm(100, 21, 1), y=rnorm(100, 21, 1))

# Add extra space to right of plot area; change clipping to figure
par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE)

# Plot both groups
plot(y ~ x, A, ylim=range(c(A$y, B$y)), xlim=range(c(A$x, B$x)), pch=1,
               main="Scatter plot of two groups")
points(y ~ x, B, pch=3)

# Add legend to top right, outside plot region
legend("topright", inset=c(-0.2,0), legend=c("A","B"), pch=c(1,3), title="Group")

inset=c(-0.2,0)的第一个值可能需要根据图例的宽度进行调整。

票数 159
EN

Stack Overflow用户

发布于 2014-02-15 00:06:31

除了已经提到的解决方案(使用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)

结果是:

票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3932038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档