[r] 在基本图形中绘制绘图区域外的图例?


Answers

没有人提到对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)的第一个值可能需要根据图例的宽度进行调整。

Question

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

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

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

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

尝试一下




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

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

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)在Left下
  • 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)更快地访问它,以便它将在您的浏览器中为您打开图形。

url = response$url
filename = response$filename

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




添加另一个在我看来非常优雅的简单替代方案。

你的情节:

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

结果:

这里只有图例的第二行被添加到您的示例中。 反过来:

  • inset=c(0,1) - 将图例按(x,y)方向的绘图区域分数移动。 在这种情况下,图例处于"bottomright"位置。 它由x方向上的0个绘制区域(因此保持在“右”)和1个y方向上的绘制区域(从下到上)移动。 它恰好位于情节之上。
  • 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"
       )

在这里,我们简单地调整了图例位置,并在图的右侧添加了额外的边距空间。 结果:




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

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

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






Related



Tags

r r   plot   legend