Выравнивание временных рядов с помощью ggplot2, scale и ggpubr - PullRequest
0 голосов
/ 22 мая 2019

У меня есть временной ряд, в котором я хотел бы визуализировать процентную переменную и переменную счета.Я бы хотел, чтобы график подсчета был больше графика в процентах.Соединение двух графиков с использованием ggpubr работает, проблема в том, что ось X не выравнивается между графиками, что затрудняет сравнение.Любое решение или обходной путь?

Пример

    library(tidyverse)
    library(lubridate)
    library(scales)
    library(ggpubr)

    df <- data.frame(date       = rep(seq(ymd('2015-01-01'), ymd('2018-01-01'), by = '1 month'), 2),
                     percentage = c(runif(37, 0.6, 1), runif(37, 0.5, 0.9)),
                     count      = c(runif(74, 1000000000, 2000000000)),
                     id         = c(rep('A', 37), rep('B', 37)))


    p1 <- ggplot(df, aes(x = date, y = percentage, col = id)) + 
      geom_line() +
      scale_y_continuous(labels = percent)

    p2 <- ggplot(df, aes(x = date, y = count, col = id)) + 
      geom_line() +
      scale_y_continuous(labels = comma)

    ggarrange(p1, p2, nrow = 2, common.legend = TRUE, legend = 'right', heights = c(4, 1))

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Ну, вы просили обходной путь.Это обходной путь, позволяющий быстро добраться туда, куда вам нужно!

Сначала я создал функцию маркировки, которая дополняет процент пробелами слева.Это на самом деле функция, которая возвращает функцию, которая будет полезна в вашем ggplot2 коде.

label_fun <- function(width) {
  function(x) str_pad(percent(x), width, side = "left")
}

И тогда вы можете точно определить, какую ширину вам нужно использовать, но это выглядит так вggplot2 сам код:

p1 <- ggplot(df, aes(x = date, y = percentage, col = id)) + 
  geom_line() +
  scale_y_continuous(labels = label_fun(18))

(все остальное было таким же.)

В качестве отправной точки я проверил максимальную длину других ваших меток:

nchar(comma(max(df$count))) # 13

Однако этого было недостаточно, только потому, что разные символы имеют разную ширину (например, запятые очень узкие, очевидно).Поэтому я возился оттуда.Использование функции для создания функции таким образом сделало ее очень легкой и быстрой.См. Результаты ниже.

enter image description here

0 голосов
/ 22 мая 2019

Очевидно, просто потребовался еще один аргумент

ggarrange(p1, p2, nrow = 2, common.legend = TRUE, legend = 'right', heights = c(4, 1), align = 'v')
...