1

我有一个时间序列,我想在其中可视化百分比变量和计数变量。我希望计数图大于百分比图。使用作品将两个图放在一起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))
4

2 回答 2

1

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

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

然而,这并没有足够的空间,只是因为不同的字符是不同的宽度(例如,逗号显然是超窄的)。所以我从那里修修补补。以这种方式使用一个函数来创建一个函数使得修改起来非常容易和快速。请参阅下面的结果。

在此处输入图像描述

于 2019-05-22T14:45:09.290 回答
1

显然,它只需要一个参数

ggarrange(p1, p2, nrow = 2, common.legend = TRUE, legend = 'right', heights = c(4, 1), align = 'v')
于 2019-05-22T14:42:43.253 回答