Перекрытие двух графиков с разными осью Y в ggplot

Я хочу перекрыть два графика с разными масштабами оси Y. Я использую stat_count() и geom_line. Однако geom_line не появляется на графике.

Я использую следующий код.

library(ggplot2)

ggplot(X1, aes(x = Week)) + 
  stat_count() +
  scale_x_continuous(breaks = seq(from = 0, to = 21, by = 1))+
  scale_y_continuous(
    name = expression("Count"), 
    limits = c(0, 20),
    sec.axis = sec_axis(~ . * 15000 / 20, name = "Views"))+
  geom_line(aes(y = Views), inherit.aes = T)

Вот воспроизводимый пример моего фрейма данных X1.

structure(list(Views = c(1749, 241, 309, 326, 237, 276, 2281, 
1573, 10790, 1089, 1732, 3263, 2601, 2638, 2929, 3767, 2947, 
65, 161), Week = c(1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 6, 8, 8, 8, 
8, 9, 10, 10, 10)), row.names = c(NA, -19L), class = c("tbl_df", 
"tbl", "data.frame"))

Сюжет, который я получаю на выходе

Не могли бы вы помочь мне поставить geom_line на участок, пожалуйста?


person Yuliia Zhaha    schedule 21.05.2020    source источник


Ответы (2)


Я также обобщил данные, чтобы улучшить интерпретацию всплеска 5-й недели, и нанес на график отдельные слои.

x1 <- structure(list(Views = c(1749, 241, 309, 326, 237, 276, 2281, 
                               1573, 10790, 1089, 1732, 3263, 2601, 2638, 2929, 3767, 2947, 
                               65, 161), Week = c(1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 6, 8, 8, 8, 
                                                  8, 9, 10, 10, 10)), row.names = c(NA, -19L), class = c("tbl_df", 
                                                                                                         "tbl", "data.frame"))

x2 <- x1 %>% 
  group_by(Week) %>% 
  summarise(Views = sum(Views))
library(ggplot2)

ggplot() + 
  geom_line(data = x2, mapping = aes(x = Week, y = Views/15000 * 20))+
  geom_bar(data = x1, mapping = aes(x = Week), stat = 'count')+
  scale_x_continuous(breaks = seq(from = 0, to = 21, by = 1))+
  scale_y_continuous( name = expression("Count"), 
                     ylim.prim <- c(0, 20),
                     ylim.sec <- c(0, 15000),
                     sec.axis = sec_axis(~ . * 15000 / 20, name = "Views"))

введите здесь описание изображения

person Susan Switzer    schedule 21.05.2020
comment
Благодарю вас! Оно работает! Я также добавил geom_point(data = x2, mapping = aes(x = Week, y = Views/15000 * 20)), чтобы избежать неправильного толкования недели 7, когда просмотров не было. - person Yuliia Zhaha; 21.05.2020

Вы также должны настроить значения y так, чтобы они соответствовали ограничениям первичной оси y, т. е. применить преобразование, используемое для вторичной оси y, также внутри geom_line. Попробуй это:

X1 <- structure(list(Views = c(1749, 241, 309, 326, 237, 276, 2281, 
                         1573, 10790, 1089, 1732, 3263, 2601, 2638, 2929, 3767, 2947, 
                         65, 161), Week = c(1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 6, 8, 8, 8, 
                                            8, 9, 10, 10, 10)), row.names = c(NA, -19L), class = c("tbl_df", 
                                                                                                   "tbl", "data.frame"))

library(ggplot2)

ggplot(X1, aes(x = Week)) + 
  stat_count() +
  scale_x_continuous(breaks = seq(from = 0, to = 21, by = 1))+
  scale_y_continuous(
    name = expression("Count"), 
    limits = c(0, 20),
    sec.axis = sec_axis(~ . * 15000 / 20, name = "Views"))+
  geom_line(aes(y = Views / 15000 * 20), inherit.aes = T)

Создано 21 мая 2020 г. с помощью пакета reprex (v0.3.0)

person stefan    schedule 21.05.2020