R-在多个图的外边缘绘制一个居中的图例

Posted

技术标签:

【中文标题】R-在多个图的外边缘绘制一个居中的图例【英文标题】:R-plot a centered legend at outer margins of multiple plots 【发布时间】:2014-07-27 18:18:01 【问题描述】:

我想在具有多个绘图的设备的绘图区域之外绘制一个居中的图例。 SO中有很多关于改变R图中图例位置的问题(略有不同)。

例如:

1) R - Common title and legend for combined plots

2)Common legend for multiple plots in R

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

等等

现在我从上述问题中了解到,我必须设置选项 xpd = Txpd = NA 以在外边缘绘制图例。但是,当我尝试这个时,它对我不起作用..

par(mfrow=c(1,2),oma=c(0,3,0,0),xpd=TRUE)

plot(c(5,10),col=c("red","blue"),pch=20,cex=2,bty="n",xlab="",ylab="")
barplot(c(5,10),col=c("red","blue"))

mtext(text="My two plots",side=3,cex=2,outer=TRUE,line=-3)

legend("top",legend=c("A", "B"),fill=c("red","blue"),ncol=2,xpd=NA,bty="n")  # Option 1
legend(x=0.01,y=11,legend=c("A", "B"),fill=c("red","blue"),ncol=2,xpd=TRUE,bty="n") # Option 2

现在我的问题是,xpd 究竟是如何工作的?因为我无法弄清楚为什么不应该将图例放在 xpd=T 的情节区域之外。

如果有人认为这是上述问题的重复,我提前道歉!

非常感谢您的帮助

阿什温

【问题讨论】:

【参考方案1】:

选项#1 可能是您应该采取的路线,xpd=NA。它不会自动将图例放置在外边距中,但它允许您将图例放置在您想要的任何位置。因此,例如,您可以使用此代码将图例放置在页面顶部,大致居中。

legend(x=-1.6, y=11.6, legend=c("A", "B"), fill=c("red", "blue"), ncol=2, xpd=NA, bty="n")

我通过反复试验选择了这些 x 和 y 值。但是,您可以定义一个函数,将单个(不可见)图覆盖在您创建的图之上。然后你可以使用legend("top", ...)。例如

reset <- function() 
    par(mfrow=c(1, 1), oma=rep(0, 4), mar=rep(0, 4), new=TRUE)
    plot(0:1, 0:1, type="n", xlab="", ylab="", axes=FALSE)
    

reset()
legend("top", legend=c("A", "B"), fill=c("red", "blue"), ncol=2, bty="n")

【讨论】:

很酷,谢谢.. 无论如何可以自动确定 x 和 y 值还是需要通过跟踪和错误来确定?? 您可以使用一种解决方法...例如将一个图覆盖在另外两个上,这样您就可以调用legend("top", ...)。我将在我的答案中添加一个示例。【参考方案2】:

我也很难获得边缘坐标。我想我找到了一个解决方案,您可以使用以下命令指定图例的坐标: getCoords() 函数。

还可以查看 plotfunctions 包中的 legend_margin 函数。 因此,将 Jean V. Adams 的解决方案与这些功能之一结合起来应该可以帮助您实现目标。 希望有效:)

【讨论】:

以上是关于R-在多个图的外边缘绘制一个居中的图例的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用ggExtra包的ggMarginal函数在散点图的顶部和右侧添加边缘直方图自定义边缘直方图不同分组的填充色并指定图例配置到图像左侧(legend on left of plot)

多个重叠图的 Seaborn 图例修改

如何绘制这个有很多功能的图的图例?

图例与来自不同数据帧的多个图的交互:如何处理这种交互?

我们如何根据颜色标记散点图的图例

R中子图plot_ly中每个图附近的图例