0

我有以下数据结构“x”:

# A tibble: 18 x 4
   mm         mm_fct     Legenda waarde
   <date>     <fct>      <chr>    <dbl>
 1 2020-07-01 2020-07-01 Gas      0.906
 2 2020-07-01 2020-07-01 Temp    17.3  
 3 2020-08-01 2020-08-01 Gas      0.935

这由(x 轴需要因子(!))很好地绘制:

 ggplot(x, aes(mm_fct, waarde, fill = Legenda)) +
    geom_col(position = position_dodge2())

我喜欢在 x 轴上有一个日期,所以添加到 scale_x_date() 但然后得到一个错误:

  ggplot(x, aes(mm_fct, waarde, fill = Legenda)) +
    geom_col(position = position_dodge2()) +
    scale_x_date(x$mm)

错误:无效输入:date_trans 仅适用于 Date 类的对象

我在 scale_x_date() 中作为参数输入的内容。

请帮忙 !

4

2 回答 2

1

为什么不直接mm用作 x 轴的变量?在这种情况下,您也不需要ggplot2::scale_x_date().

library(tidyverse)
library(lubridate)

x <- tibble::tribble(
    ~mm,          ~mm_fct,      ~Legenda, ~waarde,
    "2020-07-01", "2020-07-01", "Gas",    0.906,
    "2020-07-01", "2020-07-01", "Temp",   17.3,
    "2020-08-01", "2020-08-01", "Gas",    0.935
  ) %>%
  dplyr::mutate(
    mm = lubridate::as_date(mm),
    mm_fct = as.factor(mm_fct)
  )


ggplot2::ggplot(
    data = x,
    mapping = ggplot2::aes(
      x = mm,
      y = waarde,
      fill = Legenda
    )
  ) +
  ggplot2::geom_col(
    position = position_dodge2()
  )
于 2021-03-28T11:20:02.367 回答
1

编辑:在 tjebo 的评论之后,他正确地指出,因此这个答案与 van Nijnatten 的答案几乎相同。我能看到的唯一区别是使用as_date函数与ymd来自 lubridate 的函数。为范尼纳腾点赞!!!请参阅我对 tjebo 评论的评论。

要处理“准”时间序列,您可以使用lubridate带有ymd函数的包。然后您的 x 轴可以作为时间序列处理。现在您可以使用scale_x_date().

library(tidyverse)
library(lubridate)

x <- x %>% 
  mutate(mm = ymd(mm))
         
ggplot(x, aes(mm, waarde, fill = Legenda)) +
  geom_col(position = position_dodge2())

数据:

# code from van Nijnatten
x <- tibble::tribble(
  ~mm,          ~mm_fct,      ~Legenda, ~waarde,
  "2020-07-01", "2020-07-01", "Gas",    0.906,
  "2020-07-01", "2020-07-01", "Temp",   17.3,
  "2020-08-01", "2020-08-01", "Gas",    0.935
) 

在此处输入图像描述

于 2021-03-28T11:34:11.210 回答