Как изменить отображение объектов POSIXct в названии фасетов?

#r #ggplot2 #posixct

#r #ggplot2 #posixct

Вопрос:

Я пытаюсь создать график ggplot2 с помощью facet_grid(). Каждый фасет должен быть озаглавлен датой (здесь объект POSIXct), и я хотел бы изменить способ его отображения.

Как я могу контролировать способ отображения объектов POSIXct в названии фасетов ggplot2?

Пример: вот как это отображается: «2019-03-29» и вот как я хотел бы видеть это написанным: «29/03/2018»

Я уже посмотрел на функцию labeller, но я не могу понять, как использовать ее, чтобы изменить способ отображения объектов POSIXct. Возможно, я чего-то не понимаю. Я знаю, что метки фасетов можно изменить «вручную», но здесь я хочу решение, которое работает для любого объекта POSIXct.

 # create a dummy dataframe named ex
ex = structure(list(date = structure(c(1510531200, 1510531200, 1522195200, 
                                  1522195200), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
               cat = c("a", "b", "a", "b"), measure = c(0.0777420913800597, 
                                                        0.71574708330445, 0.725231731543317, 0.217509124660864)), row.names = c(NA, 
                                                                                                                                -4L), vars = "date", indices = list(0:1, 2:3), group_sizes = c(2L, 
                                                                                                                                                                                               2L), biggest_group_size = 2L, labels = structure(list(date = structure(c(1510531200, 
                                                                                                                                                                                                                                                                        1522195200), class = c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                                    -2L), class = "data.frame", vars = "date", indices = list(c(0L, 
                                                                                                                                                                                                                                                                                                                                                                                                                1L, 8L, 9L, 16L, 17L), c(2L, 3L, 4L, 5L, 10L, 11L, 12L, 13L, 
                                                                                                                                                                                                                                                                                                                                                                                                                                         18L, 19L, 20L, 21L), c(6L, 7L, 14L, 15L, 22L, 23L)), group_sizes = c(6L, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              12L, 6L), biggest_group_size = 12L, labels = structure(list(date = structure(c(1510531200, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             1522195200, 1543881600), class = c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     -3L), class = "data.frame", vars = "date"), drop = TRUE), drop = TRUE, class = c("grouped_df", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      "tbl_df", "tbl", "data.frame"))

# create a graph

plot_ex = ggplot(ex, aes(x = cat, y = measure))  
  geom_bar(stat = "identity")  
  facet_grid(.~date)
print(plot_ex)
  

Фасеты называются «2017-11-13» и «2018-03-28». Я хочу, чтобы они были «13/11/2017» и «28/03/2018».

Большое спасибо за вашу помощь,

Ответ №1:

Вы можете изменить способ печати дат с помощью format . Используя это, мы можем установить соответствующий ярлык, не изменяя столбец data.frame.

 ggplot(ex, aes(x = cat, y = measure))  
  geom_bar(stat = "identity")  
  facet_grid(.~date, labeller = function(x) format(x, '%d/%m/%Y'))
  

введите описание изображения здесь

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

1. Большое спасибо, я полностью пропустил эту опцию «format ()», когда тестировал код.

Ответ №2:

Мы можем использовать strftime .

 ex$date <- strftime(ex$date, format="%d/%m/%Y")

library(ggplot2)
plot_ex <- ggplot(ex, aes(x=cat, y=measure))  
  geom_bar(stat="identity")  
  facet_grid(.~date)
print(plot_ex)
  

введите описание изображения здесь

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

1. Большое вам спасибо, этот ответ работает и хорош, когда вы можете изменять данные вне процесса создания графика. Однако здесь я действительно не могу этого сделать (мой плохой, я должен был лучше объяснить в своем посте).

2. Я думаю, что этот метод не сохраняет порядок сортировки дат.