使用第二个变量标记ggplot2 facets中的轴刻度

时间:2017-08-08 02:02:46

标签: ggplot2 axis-labels facet-wrap

我试图使用ggplot2制作一个刻面的t图表,其中x轴表示一系列事件,y轴表示这些事件之间的天数。 x轴应标记事件日期,但它不是时间序列,因为不管事件之间的实际时间如何,x轴刻度之间的距离应该是一致的。

添加分面图层让我很困惑。这是一些示例数据:

df <- data.frame(EventDT = as.POSIXct(c("2014-11-22 07:41:00", "2015-02-24 08:10:00",
                                  "2015-06-10 13:54:00", "2015-07-11 02:43:00",
                                  "2015-08-31 19:08:00", "2014-11-18 14:06:00",
                                  "2015-06-09 23:10:00", "2016-02-29 07:55:00",
                                  "2016-05-22 04:30:00", "2016-05-25 21:46:00",
                                  "2014-12-22 16:19:00", "2015-05-13 16:38:00",
                                  "2015-06-01 09:05:00", "2016-02-21 02:30:00",
                                  "2016-05-13 01:36:00")),
             EventNBR = rep(1:5, 3),
             Group = c(rep('A', 5), rep('B',5), rep('C',5)),
             Y = c(15.818750, 94.020139, 106.238889, 30.534028, 51.684028,
                   187.670139, 203.377778, 264.364583, 82.857639, 3.719444,
                   169.829861, 142.013194, 18.685417, 264.725694,81.962500))

忽略事件的日期,我可以产生这个:

g <- ggplot(df, aes(x=EventNBR, y=Y)) +
  geom_point() +
  geom_line() + 
  facet_wrap(~ Group, scales='free_x')

Plot should show EventDT along X-axis, not EventNBR

我尝试将markers参数用于scale_x_discrete但没有成功:

xaxis.ticks <- function(x) {
    df[which(df$EventNBR) == x] }

g + scale_x_discrete(labels = xaxis.ticks)

但这种错误在我无法描述的方式中,因为它完全切断了我的刻度标签。

因为对于这个数据集,EventNBR和EventDT之间存在1-1的对应关系,看起来应该有一个简单的解决方案,但我无法弄清楚。我是否容易忽视一些事情?

1 个答案:

答案 0 :(得分:1)

一般来说,这是一个非常有问题的事情,如here所述,还有其他几个主题。

但幸运的是,您可以使用scales='free_x'

您需要做的是添加一个唯一的索引列,如

df$id <- 1:nrow(df)

然后您可以使用正确标签的列覆盖这些索引。

g <- ggplot(df, aes(x=id, y=Y)) +
    geom_point() +
    geom_line() + 
    facet_wrap(~ Group, scales='free_x')
g + scale_x_continuous(breaks=df$id, labels=df$EventDT) +
    theme(axis.text.x=element_text(angle=90, vjust=.5))

可能有更简单的解决方案,但这可以在您的示例中使用。

此外,标签似乎已消失,因为x轴是数字而不是离散的。因此,使用scale_x_continuous会生成正确的标签。

修改

所以一个完整的例子就像这样

library(ggplot2)
df <- data.frame(EventDT = as.POSIXct(c("2014-11-22 07:41:00", "2015-02-24 08:10:00",
                                        "2015-06-10 13:54:00", "2015-07-11 02:43:00",
                                        "2015-08-31 19:08:00", "2014-11-18 14:06:00",
                                        "2015-06-09 23:10:00", "2016-02-29 07:55:00",
                                        "2016-05-22 04:30:00", "2016-05-25 21:46:00",
                                        "2014-12-22 16:19:00", "2015-05-13 16:38:00",
                                        "2015-06-01 09:05:00", "2016-02-21 02:30:00",
                                        "2016-05-13 01:36:00")),
                 EventNBR = rep(1:5, 3),
                 Group = c(rep('A', 5), rep('B',5), rep('C',5)),
                 Y = c(15.818750, 94.020139, 106.238889, 30.534028, 51.684028,
                       187.670139, 203.377778, 264.364583, 82.857639, 3.719444,
                       169.829861, 142.013194, 18.685417, 264.725694,81.962500))

df$id <- 1:nrow(df)

g <- ggplot(df, aes(x=id, y=Y)) +
  geom_point() +
  geom_line() + 
  facet_wrap(~ Group, scales='free_x')
g + scale_x_continuous(breaks=df$id, labels=df$EventDT) +
  theme(axis.text.x=element_text(angle=90, vjust=.5))

并生成以下输出:

result