【发布时间】:2016-05-21 22:53:27
【问题描述】:
使用this dataset,我创建了这个图表:
我希望在geom_smooth 行下加阴影,如下所示:
我希望仅在蓝线下方或仅在粉红色线下方的点具有这些颜色,并且两条线下方的所有内容均为深灰色。
我使用此代码创建图表:
p3 <- ggplot(df, aes(x = SECONDS, y = AGE, color = GENDER)) +
geom_point() + theme_fivethirtyeight_mod() + ggtitle('Seconds vs. Age') +
geom_hline(yintercept = 0, size = 1.2, colour = "#535353") +
geom_vline(xintercept = 0, size = 1.2, colour = "#535353") +
geom_smooth(se = F) +
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1)
theme_fivethirtyeight_mod() 的代码是这样的:
require(ggplot2)
require(ggthemes)
require(ggrepel)
require(grid)
require(gtable)
theme_fivethirtyeight_mod <- function (base_size = 12, base_family = "sans") {
(theme_foundation(base_size = base_size, base_family = base_family) +
theme(line = element_line(colour = "black"),
rect = element_rect(fill = ggthemes_data$fivethirtyeight["ltgray"], linetype = 0, colour = NA),
text = element_text(colour = ggthemes_data$fivethirtyeight["dkgray"]),
axis.text = element_text(size = 11, colour = ggthemes_data$fivethirtyeight["dkgray"], face = "bold"),
axis.ticks = element_blank(),
axis.line = element_blank(),
axis.title = element_text(size = 11, colour = ggthemes_data$fivethirtyeight["dkgray"], face = "bold", vjust = 1.5),
legend.title = element_blank(),
legend.background = element_rect(fill="gray90", size=.5, linetype="dotted"),
legend.position = "bottom",
legend.direction = "horizontal",
legend.box = "vertical",
panel.grid = element_line(colour = NULL),
panel.grid.major = element_line(colour = ggthemes_data$fivethirtyeight["medgray"]),
panel.grid.minor = element_blank(),
plot.title = element_text(hjust = 0.05, size = rel(1.5), face = "bold"),
plot.margin = unit(c(1, 1, 1, 1), "lines"),
panel.background = element_rect(fill = "#F0F0F0"),
plot.background = element_rect(fill = "#F0F0F0"),
panel.border = element_rect(colour = "#F0F0F0"),
strip.background = element_rect()))
}
感谢大家的帮助!
编辑:
@MLavoie 评论了一个问题的链接,该链接让我了解了如何使用predict(loess(AGE ~ SECONDS)) 在geom_smooth 行下进行遮蔽。 predict() 的作用类似于geom_smooth,而loess 是n < 1000 时使用的方法。这使我能够在男性和女性线条下进行着色,但不允许我找到两条曲线下的区域。深灰色阴影区域是整个数据集geom_smooth下方的区域。
我怀疑要找到男性和女性曲线下的区域,我首先需要从geom_smooths(男性和女性)中捕获数据。然后,我将创建一个data.frame,其中 x 值作为行,每组 y 值都有一个列。我会找到每个 x 值的最小 y 值,然后我会在该曲线下方涂上深灰色。
有趣的是,阴影区域用浅蓝色勾勒出来,就像点一样,图例显示红色或蓝色轮廓框填充深灰色。我将其添加到代码中,而不是原来的 geom_ribbon:
geom_ribbon(data = df[df$GENDER == 'F',], aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1, fill = "red") +
geom_ribbon(data = df[df$GENDER == 'M',], aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1, fill = "blue") +
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))), alpha = 1)
这是创建此图表所涉及的唯一新代码:
本质上,我想删除填充区域的蓝色轮廓,我想从图例中的方框中删除深灰色填充,如果有人能弄清楚我想如何为两者下方的区域着色线。再次感谢!
【问题讨论】:
-
这个 (stackoverflow.com/questions/20355849/…) 可能会有所帮助
-
唯一的问题是图例仍然显示带有深灰色内部的红色或蓝色框,就像问题中一样。此外,所有带状区域的轮廓都是红色的。我将更新我的问题以关注这些最终问题,但感谢您的链接! @MLavoie