在Base R中使用Pch时围绕图例填充

时间:2019-05-22 01:27:56

标签: r format legend legend-properties

一个小问题。我正在尝试为以下情节做出传奇。

# fitting the linear model
iris_lm = lm(Petal.Length ~ Sepal.Length, data = iris)
summary(iris_lm)

# calculating the confidence interval for the fitted line
preds = predict(iris_lm, newdata = data.frame(Sepal.Length = seq(4,8,0.1)),
                  interval = "confidence")

# making the initial plot
par(family = "serif")
plot(Petal.Length ~ Sepal.Length, data = iris, col = "darkgrey",
     family = "serif", las = 1, xlab = "Sepal Length", ylab = "Pedal Length")

# shading in the confidence interval
polygon(
  c(seq(8,4,-0.1), seq(4,8,0.1)), # all of the necessary x values
  c(rev(preds[,3]), preds[,2]), # all of the necessary y values
  col = rgb(0.2745098, 0.5098039, 0.7058824, 0.4), # the color of the interval
  border = NA # turning off the border
)

# adding the regression line
abline(iris_lm, col = "SteelBlue")

# adding a legend
legend("bottomright", legend = c("Fitted Values", "Confidence Interval"),
       lty = c(1,0))

这是到目前为止的输出:

enter image description here

我的目标是在“ Confidence Interval”选项卡旁边的图例中放置一个框,并以与图片相同的阴影为其着色。自然,我想使用pch参数。但是,当我使用其他图例选项pch = c(NA, 25)重新运行代码时,得到以下信息:

enter image description here

它并不是超级引人注目,但是如果您仔细观察图例左边缘的填充,实际上它已经减少了,并且边框的边缘现在比我想要的更靠近直线。有什么办法可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

legend()中,这是一种奇怪的行为。我确定有人会建议使用ggplot2替代方案。但是,legend()确实提供了一种解决方案。此解决方案调用该函数时无需绘制任何内容即可捕获所需矩形的尺寸。然后使用图例与您真正想要的元素一起绘制图例,但不附带任何框(bty = "n")。所需的矩形已显式添加。我假设您的意思是pch = 22以获取填充框符号。我添加了pt.cex = 2以使其更大一些。

# Capture the confidence interval color, reusable variables
  myCol <- rgb(0.2745098, 0.5098039, 0.7058824, 0.4)
  legText <- c("Fitted Values", "Confidence Interval")

# Picking it up from 'adding a legend'
  ans <-  legend("bottomright", lty = c(1,0), legend = legText, plot = F)
  r <- ans$rect
  legend("bottomright", lty = c(1,0), legend = legText, pch = c(NA,22),
    pt.bg = myCol, col = c(1, 0), pt.cex = 2, bty = "n")

# Draw the desired box
  rect(r$left, r$top - r$h, r$left + r$w, r$top)

顺便说一句,如果您将图例放在左侧,我认为如果不作进一步调整,这将无法正常工作。