在 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)
顺便说一句,如果您将图例放在左侧,我认为如果不进一步调整这将无法工作。
只是一个小问题。我正在尝试为以下情节制作一个图例。
# 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)
顺便说一句,如果您将图例放在左侧,我认为如果不进一步调整这将无法工作。