如何让 position_dodge 和 scale_x_date 一起工作?

How to make position_dodge and scale_x_date work together?

我在使用 ggplot2 时遇到了以下困难。我正在尝试创建一个带有时间序列数据集的条形图,该数据集在 x 轴下显示每个条形的值和一个漂亮的日期格式。问题是:

如何解决这个问题?

df <- data.frame(period = c("2019-01-01", "2019-02-01","2019-01-01","2019-02-01"),
variable = c("A", "A", "B", "B"),
value = c(100,88, 99,77))

df$period_d <- as.POSIXct(df$period)

这很好用(但 x 轴上没有日期)。

ggplot(df, aes(x=period, y=value, group= variable, fill=variable))+
      geom_col(position= "dodge")+
      geom_text(aes(x=period, y=value,label=value),  
                position = position_dodge(1))

这很好用,但值在错误的地方

ggplot(df, aes(x=period_d, y=value, group= variable, fill=variable))+
      geom_col(position= "dodge")+
     scale_x_datetime(labels=date_format("%b-%y"),
                       breaks = date_breaks("1 month"))

但将两者混用是失败的。如果使用 POSIXct 变量,标签不在它们应在的位置,如果使用字符变量,您会收到此错误消息:"Invalid input: time_trans works with objects of class POSIXct only"

有什么想法吗?

datetimes 有 POSIXct,dates 有日期 class(没有时间戳)。后者是离散的,因此您可以将其与条形图和闪避一起使用;前者是连续的,所以你不能。

df$date = as.Date(df$period_d)

ggplot(df, aes(x=date, y=value, group= variable, fill=variable))+
    geom_col(position= "dodge")+
    geom_text(aes(x=date, y=value,label=value),
            # you are drawing one set of bars for every 30 days
            # and geom_col is using the whole space by default.
            position = position_dodge(width = 30)) +
    scale_x_date()

您可以通过绘制更细的条来使它看起来更漂亮:

ggplot(df, aes(x=date, y=value, group= variable, fill=variable))+
    geom_col(position= "dodge", width = 5)+
    geom_text(aes(x=date, y=value,label=value),
            # you are drawing one set of bars for every 30 days
            position = position_dodge(width = 5)) +
    scale_x_date()