[英]ggplot2 in R: use `geom_ribbon` for shading under two different `geom_smooth` lines
使用此數據集 ,我創建了此圖:
我希望在geom_smooth
線下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_smooth
(男性和女性)中捕獲數據。 然后,我將創建一個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)
這是創建此圖表所涉及的唯一新代碼:
從本質上講,我想刪除填充區域的藍色輪廓,我想從圖例中的方框中刪除深灰色填充,如果有人能夠弄清楚我是多么想要遮蔽兩條線下方的區域。 再次感謝!
關閉圖例的顏色或填充以獲得您想要的。
關閉顏色圖例:
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)
關閉填充圖例:
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)
幾點需要注意:
geom_ribbon
。 如果你想樹蔭其他兩個帶下的區域的交叉,遮光黃土為全面數據在區域不給你路口-你可以通過圖表少不透明的觀察(通過指定alpha
<1) alpha
= 1,因此您無需明確指定它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.