R中的ggplot2:在两个不同的`geom_smooth`行下使用`geom_ribbon`进行着色

Pra*_*rdy 5 r ggplot2

使用此数据集,我创建了此图:

秒数与种族年龄的关系图,蓝点代表男性和粉红色女性

我希望在线下阴影geom_smooth,如下:

相同的图形,但在整个数据集的<code>theme_fivethirtyeight_mod()</code>是这样的:</p>

<pre><code>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 = 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)

这是创建此图表所涉及的唯一新代码:

与上面类似的图形,但在<code> geom_smooth </ code>行下面有阴影.

从本质上讲,我想删除填充区域的蓝色轮廓,我想从图例中的方框中删除深灰色填充,如果有人能够弄清楚我是多么想要遮蔽两条线下方的区域.再次感谢!

shr*_*sgm 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)
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)

在此输入图像描述

有几点需要注意:

  1. 我不确定你为什么要使用第三个geom_ribbon。如果您想对其他两条带下方的区域的交集进行着色,则对黄土下方的区域进行着色以获取完整数据不会给出交集 - 您可以通过使图形不那么不透明(通过指定alpha< 1)来观察到这一点
  2. alpha默认情况下=1,因此您不需要显式指定它。