web-dev-qa-db-ja.com

Rに点と線の両方がある凡例

2つのデータセット(x1、y1)と(x1、y2)があります。セットごとに回帰を作成し、それらを同じプロットにプロットしたいと思います(点と回帰直線の両方を使用)。これが私のコードです

x1 <- 1:5
y1 <- x1 + rnorm(x1)
y2 <- x1 + 2 + rnorm(x1)
fit1 <- lm(y1 ~ x1)
fit2 <- lm(y2 ~ x1)
plot(x1, y1, pch = 1, ylim = c(min(y1, y2), max(y1, y2)), xlab = "x", ylab = "y")
points(x1, y2, pch = 2)
abline(fit1, lty = 1)
abline(fit2, lty = 2)
legend("topleft", legend = c("Line 1", "Line 2"), pch = c(1, 2), lty = c(1, 2))

これは私が得たものです。

enter image description here

凡例で実際に必要なのは、ポイントとラインを互いに重ねるのではなく並べて作成することです。これは次のようになります。

enter image description here

どんな提案も大歓迎です!

13
Patrick Li

私はあなたがこのようにそれを行うことができると思います:

_legend('topright',c('','name'),lty=c(1,NA),pch=c(NA,'X'),bg='white',ncol=2)
_

間隔は少し厄介かもしれませんが、線と記号が分離されます。凡例に複数の行と記号のペアを含める場合は、次のように設定してください。 lty=c(1,2,3,NA,NA,NA)

20
Carl Witthoft

あまりエレガントではありませんが、2つの凡例を簡単に並べて作成できます。凡例の場所の座標は、簡単に参照できるように保存できます(たとえば、以下のlgdオブジェクトに)。

例.

lgd <- legend("topleft", legend = c("", ""), pch = NA, lty = c(1, 2), bty="n")
legend(lgd$rect$left+lgd$rect$w, lgd$rect$top, legend = c("Line 1", "Line 2"), pch = c(1,2), bty="n")

私は個人的に@CarlWitthoftのソリューションが好きです...

4
Marc in the box