Проблемы с изменением масштаба даты на оси — ggplot

#r

#r

Вопрос:

У меня есть следующее

 data.frame
date     ratio
 1992-1    0.5
 1992-1    0.6
 1992-1    0.5
 1992-2    0.7
 1992-2    0.65
 1992-2    0.65
 

и я пытаюсь запустить следующий код для создания графика

 occratiocomb <- ggplot()  
  # blue plot
  geom_line(data=SKILL_1_OCC_FINAL, aes(x=Date, y=ratio_1occ_comb, group = 1, colour="very low"))   
  geom_smooth(data=SKILL_1_OCC_FINAL, aes(x=Date, y=ratio_1occ_comb), method = loess, fill="red",
              colour="red", size=1)   theme(axis.text.x=element_text(angle=60, hjust=1))


# PROBLEM
occratiocomb   scale_x_date(date_breaks = "1 year", date_labels = "%Y")
print(occratiocomb)
 

Ось x (дата) моего графика выглядит ужасно, поскольку у меня есть ежемесячные данные, а также показывает период в 30 лет. То, что я пытаюсь сделать сейчас, это изменить шкалу дат со шкалы, основанной на месяцах, на шкалу, основанную на годах. К сожалению, при попытке запустить код отображается ошибка date_trans работает только с объектами класса Date. На мой взгляд, это странно, потому что мой столбец даты уже находится в формате даты. Или проблема связана с тем, что моя переменная date не содержит дней?

Заранее большое спасибо Xx Freddy

Ответ №1:

Проблема, по-видимому, связана с форматом вашего столбца даты (как вы и подозревали); если вы измените формат, используя, например, lubridate, разрывы будут работать должным образом:

 library(tidyverse)
#install.packages("lubridate")
library(lubridate)

SKILL_1_OCC_FINAL <- tibble::tribble(
   ~date, ~ratio,
   "1990-1",    "0.5",
   "1990-2",    "0.6",
   "1990-3",    "0.5",
   "1991-1",    "0.7",
  "1991-2",    "0.65",
  "1991-3",    "0.65"
  )
SKILL_1_OCC_FINAL$date <- lubridate::ym(SKILL_1_OCC_FINAL$date)

occratiocomb <- ggplot(SKILL_1_OCC_FINAL, aes(x = date, y=ratio, group = 1))  
  geom_line()   
  geom_smooth(method = "loess", fill = "red", colour = "red")  
  theme(axis.text.x=element_text(angle = 60, hjust = 1))  
  scale_x_date(date_minor_breaks = "1 month",
               date_breaks = "1 year",
               date_labels = "%Y-%m")
print(occratiocomb)
 

пример.png

Комментарии:

1. К сожалению, это все еще не работает. Когда я пытаюсь запустить код lubridate, появляется сообщение об ошибке «ym не является экспортированным объектом ‘namespace: lubridate'» . Есть ли у вас какие-либо идеи, в чем может быть проблема?

2. Возможно, это связано с установленной вами версией lubridate — этот код работает с версией 1.7.9.2 — если возможно, отредактируйте свой вопрос, чтобы включить вывод sessionInfo()

3. Альтернативой является использование пакета зоопарка ( install.packages("zoo") ) и замена строки SKILL_1_OCC_FINAL$date <- lubridate::ym(SKILL_1_OCC_FINAL$date) на SKILL_1_OCC_FINAL$date <- zoo::as.Date(zoo::as.yearmon(SKILL_1_OCC_FINAL$date))