208

タイトルが示すように:ベース グラフィックスを使用する場合、プロット領域の外側に凡例をプロットするにはどうすればよいですか?

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

生成:

代替テキスト

しかし、前述のように、凡例をプロット領域の外 (たとえば、グラフ/プロットの右側) に配置したいと思います。

4

10 に答える 10

161

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)、凡例の幅に基づいて調整する必要がある場合があります。

凡例_右

于 2012-05-10T05:36:05.080 に答える
127

おそらく、必要なのは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))
于 2010-10-14T11:15:46.800 に答える
17

古いスレッドを復活させて申し訳ありませんが、今日も同じ問題がありました。私が見つけた最も簡単な方法は次のとおりです。

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

于 2011-10-24T18:02:43.870 に答える
10

既に指摘したレイアウト ソリューションの例を紹介することしかできません。

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

于 2010-10-14T11:01:00.583 に答える
3

layout()下に空のプロットを作成し、約1/4程度に適切にスケーリングし、凡例部分を手動で配置するだけで、過去にこれに使用したものを試してください。

ここには、legend()どれから始めるべきかについての古い質問がいくつかあります。

于 2010-10-14T10:17:27.687 に答える