Наложение geom_point поверх geom_line в r

Вот снимок экрана с графиком, созданным в другом программном обеспечении, который создает график рассеяния на вершине - линейный график с линией, скрытой там, где находится график рассеяния. Это то, что я собираюсь сделать в R.

enter image description here Когда я запускаю следующий код на своем графике и данных:

dput(my_df)
structure(list(lastFinancingYear = c(2010, 2011, 2012, 2013, 
2014, 2015, 2016, 2017, 2018), raiseMedVal = c(5.33287671232877, 
5.03424657534247, 4.96986301369863, 7.36986301369863, 6.44383561643836, 
7.73835616438356, 8.4958904109589, 9.9054794520548, 9.43013698630137
), foundMedVal = c(11.0821917808219, 10.5178082191781, 8.62191780821918, 
10.2520547945205, 10.9643835616438, 10.9342465753425, 12.9945205479452, 
13.5397260273973, 12.6301369863014)), row.names = c(NA, -9L), class = c("tbl_df", 
"tbl", "data.frame"))

my_df %>% ggplot() +
  geom_line(aes(x = lastFinancingYear, y = raiseMedVal), size = 1.0, color = "#DDBB7B") +
  geom_point(aes(x = lastFinancingYear, y = raiseMedVal), shape = 1, size = 3.0, color = "#DDBB7B") +
  geom_line(aes(x = lastFinancingYear, y = foundMedVal), size = 1.0)

... тогда я получаю график, который выглядит так:

enter image description here

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

Заранее спасибо!

3
0
3 332
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Чтобы это заработало, вам понадобится несколько настроек:

  • Используйте одну из закрашенных точек, например форму 21. Вы можете проверить, что это такое, с помощью example("points"), перейдя к третьему графику.
  • Используйте fill = "white" (или другой цвет) теперь, когда вы используете форму с заливкой.
  • Порядок ваших геометрий имеет значение - позже геометрия будет идти вверх, поэтому переместите geom_point() в конец.
  • Увеличьте stroke, чтобы увеличить размер границы точек

Обновленный код:

my_df %>% ggplot() +
    geom_line(aes(x = lastFinancingYear, y = raiseMedVal), size = 1.0, color = "#DDBB7B") +
    geom_line(aes(x = lastFinancingYear, y = foundMedVal), size = 1.0) +
    geom_point(aes(x = lastFinancingYear, y = raiseMedVal), size = 3.0, color = "#DDBB7B",
               shape = 21, 
               stroke = 2.0,
               fill = "white")

Результат:

enter image description here

все 3 ответа здесь были отличными - принять это, потому что это связано с изменением минимальной части моего кода. Хотя geom_pointline тоже классная

Canovice 10.09.2018 08:44

Небольшое изменение, но та же идея ...

my_df %>% ggplot() +
  geom_line(aes(x = lastFinancingYear, y = raiseMedVal), size = 0.8, color = "#DDBB7B") +
  geom_point(aes(x = lastFinancingYear, y = raiseMedVal), 
             shape = 21, size = 1.0, stroke = 1.5, color = "#DDBB7B", fill = "white") +

  geom_line(aes(x = lastFinancingYear, y = foundMedVal), size = 0.8) +
  geom_point(aes(x = lastFinancingYear, y = foundMedVal), 
             shape = 21, size = 1.5, stroke = 1.5, color = "black", fill = "white")

enter image description here

Программный подход

Если вы планируете часто использовать этот формат, возможно, вы захотите создать функцию, упрощающую его.

spotted_lines <- function(x_var, y_var, my_color = "black") {
  list(geom_line(aes(x  = x_var, y = y_var), size = 0.8, color = my_color),
       geom_point(aes(x = x_var, y = y_var), shape = 21, size = 1.0, 
            stroke = 1.5, color = my_color, fill = "white")
  )
}

Затем вы можете вызвать эту функцию внутри своего вызова ggplot, и она создаст геометрию как линий, так и точек, что сэкономит ваше время и снизит вероятность ошибок.

my_df %>% ggplot() +
  spotted_lines(x_var = my_df$lastFinancingYear, y_var = my_df$foundMedVal) +
  spotted_lines(x_var = my_df$lastFinancingYear, y_var = my_df$raiseMedVal,
                my_color = "#DDBB7B")

Если вы добавите темно-серые линии сетки, фигура будет на месте оригинала. :)

Roman Luštrik 10.09.2018 08:24

Я создал geom_pointline именно для этой ситуации (с некоторым чутьем):

library(lemon)
library(tidyr)

my_df %>%
 gather(stat, val, raiseMedVal, foundMedVal) %>%
 ggplot(aes(lastFinancingYear, val, colour=stat)) + 
 geom_pointline(distance=0.1, fill='white', shape=21, size=3.5, stroke=2, linesize=2)

Обратите внимание, что я меняю фрейм данных на длинный формат, так что цвет связан с переменной, а не жестко запрограммирован. Во-вторых, эстетика объединена в основном вызове ggplot, чтобы избежать избыточных настроек. (И мои извинения, что distance должен быть 0,1, а не 0).

enter image description here

Чтобы контролировать цвета и внешний вид легенды, используйте обычные функции ggplot2, то есть scale_colour_manual (или _hue, или _brewer, или ...).

Редактировать: Вау, я узнал об использовании stroke для управления шириной границы точек. Спасибо @Marius.

этот ответ так же хорош, как и принятый ответ, и мне очень жаль, что я не могу принять оба

Canovice 11.09.2018 04:26

Совершенно понятно, что вы выбираете тот ответ, который требует наименьших изменений. :)

MrGumble 11.09.2018 15:03

Другие вопросы по теме