Как заставить position_dodge и scale_x_date работать вместе? - PullRequest
2 голосов
/ 22 января 2020

Я столкнулся со следующей трудностью при использовании ggplot2. Я пытаюсь создать гистограмму с набором данных временного ряда, отображающим значения для каждого столбца И хороший формат даты под осью X. Проблема заключается в том, что:

  • для установки на или выше полос, необходимо использовать position_dodge, НО эта функция допускает только переменные не POSIXct
  • для функции go -to даты по оси x - это scale_x_date, для которого требуется переменная POSIXct

Как мне решить эту проблему?

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 метки находятся не там, где они должны быть, и если вы используете символьную переменную, вы получаете следующее сообщение об ошибке: «Неверный ввод: time_trans работает только с объектами класса POSIXct»

Есть мысли?

1 Ответ

1 голос
/ 22 января 2020

Существует POSIXct для datetimes и класс Date для date (без отметок времени). Последнее дискретно, так что вы можете использовать его с гистограммами и уклонением; первый является непрерывным, поэтому вы не можете.

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()

enter image description here

Вы можете сделать этот образ более приятным, нарисовав более тонкие полосы:

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()

IMprov

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...