2016-05-21 2 views
4

Использование this dataset, я создал этот график:ggplot2 в R: используйте `geom_ribbon` для затенения в двух различных` geom_smooth` линий

A graph for seconds vs age of a race, with blue points representing males and pink females

Я хочу, чтобы тени под geom_smooth линий, например, так:

The same graph, but with shading below a <code>geom_smooth</code> line for the entire dataset.

Я хочу точек только под синей линии или только под розовой линии, чтобы эти цвета, и все под обе линии, чтобы быть темно-серого цвета.

Я использовал этот код для создания графика:

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())) 
} 

Спасибо за помощь!

EDIT:

@MLavoie прокомментировал ссылку на вопрос, который дал мне общее представление о том, как тень под geom_smooth линий с помощью predict(loess(AGE ~ SECONDS)). predict() работает как geom_smooth, и loess - это метод, используемый при n < 1000. Это позволило мне затенять под мужские и женские линии, но не позволил мне найти область под обеими кривыми. Темно-серая затененная область - это область под номером geom_smooth для всего набора данных.

Я подозреваю, что, чтобы найти область под мужской и женской кривыми, мне сначала нужно было захватить данные с geom_smooth (мужские и женские). Затем я создавал бы data.frame с x-значениями в виде строк и столбцом для каждого набора значений y. Я бы нашел минимальное значение y для каждого x-значения, и я бы затенял темно-серый под этой кривой.

Интересно, что затененные области очерчены светло-голубыми, как точки, а в легенде показаны красные или синие наброски, заполненные темно-серым цветом. Я добавил это в код вместо оригинального 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) 

Это был единственный новый код участвует в создании этого графика:

A graph similar to the above, but with shading underneath <code>geom_smooth</code> lines.

В сущности, я хочу, чтобы удалить синие контуры из заполненных областей, и я хочу удалить темно-серое заполнение из ящиков в легенде, и если кто-то может понять, как я хотел бы затенять область под обеими линиями. Еще раз спасибо!

+0

это (http://stackoverflow.com/questions/20355849/ggplot2-shade-area-under-density-curve-by-group) может помочь – MLavoie

+0

Единственная проблема заключается в том, что легенда все еще показывает красный или синий коробки с темно-серым интерьером, как в вопросе. Кроме того, контур ленточных областей краснеет для всех из них. Я собираюсь обновить свой вопрос, чтобы сосредоточиться на этих последних проблемах, но спасибо за ссылку! @MLavoie –

ответ

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) 

enter image description here

Выключение заполнения Легенда:

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) 

enter image description here

отметить несколько моментов:

  1. Я не уверен, почему вы используете третий geom_ribbon. Если вы хотите затенять пересечение областей под двумя другими лентами, затеняя область под лессой для полных данных, не, то вы можете увидеть это, сделав графики менее непрозрачными (указав alpha < 1)
  2. alpha = 1 по умолчанию, поэтому вам не нужно указывать его явно.
+0

Я обновил свой вопрос, чтобы объяснить, как я думаю, что я пошлю затенение этой общей области. Я хочу, чтобы 'alpha' был 1, поэтому я надеюсь, что кто-то знает, как найти область под обеими линиями. Спасибо за информацию о легенде, хотя! Я все еще получаю схему вокруг областей geom_ribbon, поэтому вы знаете, как ее удалить? Я считаю, что контурный цвет - это цвет точки, как вы бы видели на строке 'geom_smooth', но вокруг третьего' geom_ribbon' (который, как мне известно, нуждается в исправлении), контур является синим для мужчин. –

+0

И я понял, как удалить контур. Мне просто пришлось удалить «geom_smooth (se = F)»! –

Смежные вопросы