簡體   English   中英

R中的ggplot2:在兩個不同的`geom_smooth`行下使用`geom_ribbon`進行着色

[英]ggplot2 in R: use `geom_ribbon` for shading under two different `geom_smooth` lines

使用此數據集 ,我創建了此圖:

秒數與種族年齡的關系圖,藍點代表男性和粉紅色女性

我希望在geom_smooth線下geom_smooth ,如下:

相同的圖形,但在整個數據集的<code> geom_smooth </ 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 = "#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 < 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)

這是創建此圖表所涉及的唯一新代碼:

與上面類似的圖形,但在<code> geom_smooth </ 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 = "#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 <1)
  2. 默認情況下, alpha = 1,因此您無需明確指定它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM