使用此数据集,我创建了此图:
我希望在线下阴影geom_smooth,如下:
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助!
编辑:
@MLavoie评论了一个问题的链接,该问题给了我一个基本的想法,即如何geom_smooth通过使用a来划线predict(loess(AGE ~ SECONDS)).predict()是的geom_smooth,并且loess是使用的方法n < 1000.这使我能够在男性和女性线下遮阴,但是不允许我在两条曲线下找到该区域.深灰色阴影区域是geom_smooth整个数据集下面的区域.
我怀疑要找到男性和女性曲线下的区域,我首先需要从geom_smooths(男性和女性)捕获数据.然后,我将创建一个data.framex值作为行和每列y值的列.我会找到每个x值的最小y值,我会在该曲线下方遮蔽深灰色.
有趣的是,阴影区域用浅蓝色勾勒出轮廓,就像点一样,图例中的红色或蓝色轮廓框用深灰色填充.我将此添加到代码而不是原始代码中geom_ribbon:
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()))
}
Run Code Online (Sandbox Code Playgroud)
这是创建此图表所涉及的唯一新代码:
从本质上讲,我想删除填充区域的蓝色轮廓,我想从图例中的方框中删除深灰色填充,如果有人能够弄清楚我是多么想要遮蔽两条线下方的区域.再次感谢!
关闭颜色或填充的图例以获得您想要的效果。
关闭颜色图例:
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(data = df[df$GENDER == 'F',],
aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS)),
fill = "Female"),colour = F) +
geom_ribbon(data = df[df$GENDER == 'M',],
aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS)),
fill = "Male"),colour = F) +
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))),
colour = F) +
scale_fill_manual(values = c('Female' = 'red','Male' = 'blue')) +
guides(colour = F)
Run Code Online (Sandbox Code Playgroud)
关闭填充图例:
p4 <- 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(data = df[df$GENDER == 'F',],
aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))),
fill = 'red',colour = F) +
geom_ribbon(data = df[df$GENDER == 'M',],
aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))),
fill = 'blue',colour = F) +
geom_ribbon(aes(ymin = 0, ymax = predict(loess(AGE ~ SECONDS))),
colour = F) +
guides(fill = F)
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:
geom_ribbon。如果您想对其他两条带下方的区域的交集进行着色,则对黄土下方的区域进行着色以获取完整数据不会给出交集 - 您可以通过使图形不那么不透明(通过指定alpha< 1)来观察到这一点alpha默认情况下=1,因此您不需要显式指定它。