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

我想过摆弄布局并生成一个只包含图例的空图,但我对只使用基本图形设施和例如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))

生产:

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


当前回答

没有人提到在图例中使用负插入值。下面是一个例子,图例位于图的右侧,与顶部对齐(使用关键字“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)的第一个值可能需要根据图例的宽度进行调整。

其他回答

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

您可以使用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) Under Right

然后是回应。

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

当您进行调用时,Plotly返回带有图形的URL。您可以通过调用browseURL(response$url)来更快地访问它,这样它就会在浏览器中为您打开图形。

url = response$url
filename = response$filename

这就得到了这个图。您还可以从GUI中移动图例,然后图形将相应地缩放。坦白地说,我是Plotly团队的一员。

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