R 是否在基础图形的打印区域之外打印图例?

R 是否在基础图形的打印区域之外打印图例?,r,plot,legend,R,Plot,Legend,如标题所示:使用基本图形时,如何在绘图区域外绘制图例? 我曾想过摆弄布局并生成一个只包含图例的空绘图,但我对一种仅使用基本图形工具的方法感兴趣,例如,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", "gr

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

我曾想过摆弄
布局
并生成一个只包含图例的空绘图,但我对一种仅使用基本图形工具的方法感兴趣,例如,
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))
产生:

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

尝试
layout()

这里有一些关于
legend()
的老问题,您可以从中开始。

试试
layout()
,我过去使用过它,只需在下面创建一个空图,以大约1/4的比例正确缩放,然后手动将图例部分放置其中


这里有一些关于
legend()
的老问题,您可以从这些问题入手。

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

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

也许你需要的是
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))

也许你需要的是
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))

很抱歉恢复了一个旧线程,但我今天遇到了相同的问题。我发现的最简单的方法是:

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

在此处找到:

很抱歉恢复了一个旧线程,但我今天遇到了相同的问题。我找到的最简单的方法是:

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

在此处找到:

没有人提到为
图例使用负
插入值。下面是一个示例,图例位于绘图右侧,与顶部对齐(使用关键字
“topright”

#要绘图的随机数据:

A没有人提到为
图例
使用负
插入值。下面是一个示例,图例位于绘图右侧,与顶部对齐(使用关键字
“topright”

#要绘图的随机数据:

A您可以使用,也可以使用代码,或者通过将图例拖动到需要的位置,从GUI执行此操作

下面是一个例子。图形和代码也在这里

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

legendstyle = list("x"=100, "y"=1)
layoutstyle = list(legend=legendstyle)
以下是其他选项:

  • 列表(“x”=100,“y”=0)
    用于右下外侧
  • 列表(“x”=100,“y”=1)
    右上方外侧
  • 列表(“x”=100,“y”=0.5)
    右中外侧
  • 列表(“x”=0,“y”=-100)
    位于左侧下方
  • 列表(“x”=0.5,“y”=-100)
    在中间
  • 列表(“x”=1,“y”=-100)
    右侧下方
然后是回应

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

当你打电话时,用图形打印返回URL。你可以通过调用
browseURL(response$URL)
更快地访问该URL,这样它就会在浏览器中为你打开图形

url = response$url
filename = response$filename
这给了我们这个图形。你也可以从GUI中移动图例,然后图形将相应地缩放。完全公开:我是Plotly团队的成员


您可以使用,也可以使用代码,或者通过将图例拖动到所需的位置,从GUI执行此操作

下面是一个例子。图形和代码也在这里

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

legendstyle = list("x"=100, "y"=1)
layoutstyle = list(legend=legendstyle)
以下是其他选项:

  • 列表(“x”=100,“y”=0)
    用于右下外侧
  • 列表(“x”=100,“y”=1)
    右上方外侧
  • 列表(“x”=100,“y”=0.5)
    右中外侧
  • 列表(“x”=0,“y”=-100)
    位于左侧下方
  • 列表(“x”=0.5,“y”=-100)
    在中间
  • 列表(“x”=1,“y”=-100)
    右侧下方
然后是回应

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

当你打电话时,用图形打印返回URL。你可以通过调用
browseURL(response$URL)
更快地访问该URL,这样它就会在浏览器中为你打开图形

url = response$url
filename = response$filename
这给了我们这个图形。你也可以从GUI中移动图例,然后图形将相应地缩放。完全公开:我是Plotly团队的成员


除了前面提到的ONDE(使用
layout
par(xpd=TRUE)
)之外,另一种解决方案是在整个设备上覆盖一个透明的绘图,然后在上面添加图例

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

par(fig=c(0, 1, 0, 1), oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0), new=TRUE)
需要设置
oma
mar
,因为我们希望绘图的内部覆盖整个设备。
new=TRUE
是必需的
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(xpd=T, mar=par()$mar+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(locator(1),c("group A", "group B"), pch = c(1,2), lty = c(1,2))
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))
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("bottomright", c("group A", "group B"), pch=c(1,2), lty=c(1,2),
       inset=c(0,1), xpd=TRUE, horiz=TRUE, bty="n"
       )
par(mar=c(5,4,2,6))
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("topleft", c("group A", "group B"), pch=c(1,2), lty=c(1,2),
       inset=c(1,0), xpd=TRUE, bty="n"
       )