在基本graphics的绘图区域之外绘制一个图例?

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

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

生产:

替代文字

但是正如所说的,我希望这个传说不在绘图区域之外(例如,在图表的右侧)。

也许你需要的是par(xpd=TRUE) ,使事情能够绘制在绘图区域之外。 所以如果你用bty='L'来做主要的情节,你会在右边bty='L'一些空间来expression传奇。 通常情况下,这将被剪切到绘图区域,但是执行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)) 

没有人提到使用负inset值的legend 。 这里是一个例子,图例右侧的图例是顶部(使用关键字"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)的第一个值可能需要根据图例的宽度进行调整。

legend_right

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

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

 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", ...) 

会在设备的右下angular添加一个图例。 同样,我们可以将图例添加到顶部或右边距。 我们唯一需要确保的是原始情节的边缘足够大,以适应传说。

把这一切放到一个function上;

 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(...) } 

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

 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) 

导致:

示例图显示顶部边距的图例

对不起复活旧的线程,但今天我也遇到同样的问题。 我find的最简单的方法如下:

 # Expand right side of clipping rect to make room for the legend par(xpd=T, mar=par()$mar+c(0,0,0,6)) # Plot graph normally 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") # Plot legend where you want legend(3.2,1,c("group A", "group B"), pch = c(1,2), lty = c(1,2)) # Restore default clipping rect par(mar=c(5, 4, 4, 2) + 0.1) 

在这里find: http : //www.harding.edu/fmccown/R/

我喜欢这样做:

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

在这里输入图像描述

最近我发现非常容易和有趣的function,打印你想要的情节区外的传奇。

使外边缘在图的右侧。

 par(xpd=T, mar=par()$mar+c(0,0,0,5)) 

创build一个情节

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

添加图例并使用locator(1)函数,如下所示。 然后你必须在加载下面的脚本后点击你想要的位置。

 legend(locator(1),c("group A", "group B"), pch = c(1,2), lty = c(1,2)) 

试试吧,享受吧

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

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

一个丑陋的图片:S

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

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

您可以使用Plotly R API ,使用代码或通过将图例拖动到所需的位置从GUI进行此操作。

这是一个例子。 图表和代码也在这里 。

 x = c(0,1,2,3,4,5,6,7,8) y = c(0,3,6,4,5,2,3,5,4) x2 = c(0,1,2,3,4,5,6,7,8) y2 = c(0,4,7,8,3,6,3,3,4) 

通过将x和y值之一指定为100或-100,可以将图例定位在图表的外部。

 legendstyle = list("x"=100, "y"=1) layoutstyle = list(legend=legendstyle) 

以下是其他选项:

  • 右边底部的list("x" = 100, "y" = 0)
  • list("x" = 100, "y"= 1)右上方
  • list("x" = 100, "y" = .5)在右边中间
  • list("x" = 0, "y" = -100)在左下
  • list("x" = 0.5, "y" = -100)在中心下
  • list("x" = 1, "y" = -100)在右边

然后回应。

response = p$plotly(x,y,x2,y2, kwargs=list(layout=layoutstyle));

当你拨打电话时,会返回一个包含你的图表的URL。 您可以通过调用browseURL(response$url)来更快地访问它,以便它将在您的浏览器中为您打开graphics。

 url = response$url filename = response$filename 

这给了我们这张图。 您也可以从GUI中移动图例,然后graphics将相应地缩放。 充分披露:我在Plotly团队。

图表侧的图例