【问题标题】:ggplot2 in R: use `geom_ribbon` for shading under two different `geom_smooth` linesR中的ggplot2:使用`geom_ribbon`在两条不同的`geom_smooth`线下进行着色
【发布时间】: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,而loessn &lt; 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

标签: r ggplot2


【解决方案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)

注意几点:

  1. 我不确定你为什么要使用第三个geom_ribbon。如果您想遮蔽其他两条色带下方区域的交点,则为完整数据遮蔽黄土下方的区域不会不会给您提供交点 - 您可以通过使图表不那么不透明来观察这一点(通过指定alpha
  2. alpha=1 默认情况下,因此您无需明确指定。

【讨论】:

  • 我更新了我的问题以解释我认为我将如何对那个关节区域进行着色。我希望alpha 为1,所以我希望有人知道如何找到两条线下的区域。不过,感谢您提供有关传奇的信息!我仍然在geom_ribboned 区域周围找到轮廓,所以你知道如何删除它吗?我相信轮廓颜色是点的颜色,就像您在geom_smooth 线上看到的那样,但在第三个geom_ribbon(我知道需要修复)附近,男性的轮廓是蓝色的。
  • 我想出了如何删除轮廓。我只需要删除 geom_smooth(se = F)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2014-11-17
相关资源
最近更新 更多