在基本图形中绘制绘图区域外的图例?
正如标题所示: 使用基本图形时,如何在绘图区域外绘制图例?
我想过摆弄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'
做主要情节,你会在右边留出一些空间来表达传奇。 通常情况下,这将被剪切到绘图区域,但是请执行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)
的第一个值可能需要根据图例的宽度进行调整。
除了已经提到的ondes(使用layout
或par(xpd=TRUE)
)之外,另一个解决方案是用整个设备上的透明图形覆盖您的图,然后将图例添加到该图中。
诀窍是在完整的绘图区域上覆盖一个(空白)图形并添加图例。 我们可以使用par(fig=...)
选项。 首先,我们指示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
来阻止R启动新设备。 然后我们可以添加空图:
plot(0, 0, type='n', bty='n', xaxt='n', yaxt='n')
我们准备添加图例:
legend("bottomright", ...)
将在设备的右下方添加一个图例。 同样,我们可以将图例添加到顶部或右侧边距。 我们唯一需要确保的是原始地块的边缘足够大以容纳传奇。
把所有这些放到一个函数中;
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(...)
}
还有一个例子。 首先创建情节,确保底部有足够的空间添加图例:
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)
导致:
链接地址: http://www.djcxy.com/p/30827.html上一篇: Plot a legend outside of the plotting area in base graphics?