R: ggplot2 - Масштабирование вторичного «квартала года» x оси даты на основе первичного «месяца» x оси даты - PullRequest
0 голосов
/ 29 мая 2020

Я хотел бы иметь две оси x. Один из них (предпочтительно первичный) имеет квартал года, а второй - месяцы. Я пытаюсь сделать это, поскольку мои наблюдения за датами не являются единообразными / последовательными. т.е. у меня может быть только январь в первом квартале, но все 3 месяца во втором квартале.

Моя попытка заключалась в том, чтобы использовать scale_x_date с датой в стандартном формате даты (as.Date()) и с использованием date_labels и breaks. Для вторичной оси я использовал dup_axis и передал zoo::as.yearqtr.

library("zoo")
library("ggplot2")
set.seed(44)

## Creating a reproducible data-frame ##

df <- data.frame("id" = sample(1:100, 3, replace=TRUE),
                 "date" = c("2020-01-01","2020-02-01","2020-03-01",
                            "2020-04-01",
                            "2020-07-01","2020-09-01",
                            "2020-10-01","2020-11-01","2020-12-01")
                 )
## Plotting ##
df %>% 
{
ggplot(data = ., aes(x = as.Date(date), y = id, group = 1)) +
  geom_line() +
  geom_point() +
  scale_x_date(date_labels = "%b", breaks = "1 month",
               sec.axis = dup_axis(name = "month", breaks = scales::date_breaks("3 month"),  labels = as.yearqtr)
               )
}

Вот графическое изображение моей попытки: enter image description here

Недостатки, с которыми я сталкиваюсь здесь:

  1. Квартал строится за последний 3-й месяц (т.е. он будет соответствовать марту), я бы хотел, чтобы он соответствовал январю.

Дополнительно - другие проблемы с низкой серьезностью:

  1. Все даты нанесены на график, я думаю, это потому, что я использую scale_x_date, а мы должны использовать scale_x_discrete. . Было бы полезно, если бы мы написали метки только для существующих точек, в противном случае я могу, чтобы зритель мог сопоставить / интерпретировать точки своими глазами.

  2. Это самая низкая степень серьезности , но я хотел бы передать аргументы функции as.yearqtr, чтобы можно было отформатировать четверть. т.е. это даст as.yearqtr(Sys.Date()) %>% format("%y Q%q") «20 Q2» вместо «2020 Q2»

1 Ответ

0 голосов
/ 29 мая 2020

Я изменил свою попытку на другую перспективу, решение следующее:

1- Для основной проблемы решением является использование sec_axis вместо dup_axis.

Дополнительно - другие решения с низким уровнем серьезности:

1 - Для построения только существующих наблюдений я использовал unique(). Это указано в этом потоке SO ссылка

2- Из документации функции as.yearqtr я вижу format как параметр функции, но передача параметров не сработала, поэтому я Я использовал этот обходной путь labels = function(x) format(as.yearqtr(x),"%y Q%q"). Спасибо @Axeman за предоставленный синтаксис / способ.

df %>% 
{
ggplot(data = ., aes(x = as.Date(date), y = id, group = 1)) +
  geom_line() +
  geom_point() +
  scale_x_date(breaks = unique(as.Date(.$date)), date_labels = "%b",
               sec.axis = sec_axis(name = "quarter", trans = ~ ., labels = function(x) format(as.yearqtr(x),"%y Q%q"))
  ) +
  xlab("month")
}

Результат построения графика решения: enter image description here

...