将时间序列与ggplot2,比例和ggpubr对齐

时间:2019-05-22 14:23:03

标签: r ggplot2 ggpubr

我有一个时间序列,可以可视化百分比variabel和计数变量。我希望计数图大于百分比图。使用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 :(得分:0)

适当地,它只需要再一个参数即可

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

答案 1 :(得分:0)

您确实要求解决方法。这是一种变通方法,可让您快速到达目的地!

首先,我做了一个标注功能,在左边的空格处填充了百分比。实际上,它是一个返回函数的函数,在您的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