R - Memformat data per bulan dan pembungkusan faset per tahun

Saya sedang berlatih dengan R dan mengalami speedbump saat mencoba membuat grafik penumpang maskapai penerbangan per bulan.

Saya ingin menunjukkan grafik garis bulanan terpisah untuk setiap tahun dari tahun 1949 hingga 1960 dimana data telah dicatat. Untuk melakukan ini saya menggunakan ggplot untuk membuat grafik garis dengan nilai per bulan. Ini berfungsi dengan baik, namun ketika saya mencoba memisahkannya berdasarkan tahun menggunakan facet_wrap() dan memformat bidang month saat ini: facet_wrap(format(air$month[seq(1, length(air$month), 12)], "%Y")); itu mengembalikan ini:

Grafik dikembalikan

Saya juga mencoba memformat faset dengan memasukkan urutan tahun saya sendiri: rep(c(1949:1960), each = 12). Ini mengembalikan hasil berbeda yang lebih baik tetapi tetap salah:

Grafik kedua

Ini kode saya:

air = data.frame(
  month = seq(as.Date("1949-01-01"), as.Date("1960-12-01"), by="months"),
  air = as.vector(AirPassengers)
)


ggplot(air, aes(x = month, y = air)) +
  geom_point() +
  labs(x = "Month", y = "Passengers (in thousands)", title = "Total passengers per month, 1949 - 1960") +
  geom_smooth(method = lm, se = F) + 
  geom_line() +
  scale_x_date(labels = date_format("%b"), breaks = "12 month") +
  facet_wrap(format(air$month[seq(1, length(air$month), 12)], "%Y"))
#OR
  facet_wrap(rep(c(1949:1960), each = 12))

Jadi bagaimana cara membuat grafik individual per tahun?

Terima kasih!


person Lucas Peters-Murphy    schedule 14.06.2020    source sumber


Jawaban (1)


Pada percobaan kedua, Anda benar-benar dekat. Masalah utama dengan data tersebut adalah Anda mencoba membuat plot segi dengan nilai sumbu x yang berbeda (tanggal termasuk tahun). Solusi mudah untuk memperbaikinya adalah dengan mengubah data menjadi skala sumbu x "umum" dan kemudian melakukan plot segi. Berikut adalah kode yang seharusnya menampilkan plot yang diinginkan.

library(tidyverse)
library(lubridate)

air %>%
  # Get the year value to use it for the facetted plot
  mutate(year = year(month),
         # Get the month-day dates and set all dates with a dummy year (2021 in this case)
         # This will get all your dates in a common x axis scale
         month_day = as_date(paste(2021,month(month),day(month), sep = "-"))) %>%
  # Do the same plot, just change the x variable to month_day
  ggplot(aes(x = month_day, 
             y = air)) +
  geom_point() +
  labs(x = "Month", 
       y = "Passengers (in thousands)", 
       title = "Total passengers per month, 1949 - 1960") +
  geom_smooth(method = lm, 
              se = F) + 
  geom_line() +
  # Set the breaks to 1 month
  scale_x_date(labels = scales::date_format("%b"), 
               breaks = "1 month") +
  # Use the year variable to do the facetted plot
  facet_wrap(~year) +
  # You could set the x axis in an 90° angle to get a cleaner plot
  theme(axis.text.x = element_text(angle = 90,
                                   vjust = 0.5,
                                   hjust = 1))

Aspek plot berdasarkan tahun

person Jonathan V. Solórzano    schedule 14.06.2020
comment
Luar biasa, bekerja dengan sempurna! Terima kasih. Satu pertanyaan: ketika bermutasi, mengapa Anda menambahkan year = year(month)? Tampaknya tidak mengubah apa pun tentang bingkai data bagi mata saya yang tidak terlatih. Terima kasih! - person Lucas Peters-Murphy; 15.06.2020
comment
year adalah fungsi dari paket lubridate yang mendapatkan tahun dari suatu tanggal (dalam hal ini, kolom tersebut bernama bulan). Jadi baris year = year(month) sebenarnya membuat kolom baru bernama tahun yang berisi tahun kolom tanggal Anda. - person Jonathan V. Solórzano; 15.06.2020