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

Padding Around Legend when using Pch in Base R

只是一个小问题。我正在尝试为以下情节制作一个图例。

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

这是目前的输出:

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

不是很明显,但是如果你仔细观察图例左边距的填充,它实际上已经减少了,现在边框的边缘比我想要的更接近直线。有什么办法可以解决这个问题吗?

legend() 中的这种行为很奇怪。我相信有人会建议 ggplot2 替代方案。但是,legend() 确实提供了解决方案。此解决方案调用该函数而不绘制任何内容以捕获 desired 矩形的尺寸。然后用您真正想要的元素绘制图例,但没有封闭框 (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)

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