Memperbaiki urutan faset di ggplot

97

Data:

df <- data.frame(
    type   = c("T", "F", "P", "T", "F", "P", "T", "F", "P", "T", "F", "P"), 
    size   = c("50%", "50%", "50%", "100%", "100%", "100%", "150%", "150%", "150%", "200%", "200%", "200%"),
    amount = c(48.4, 48.1, 46.8, 25.9, 26, 24.9, 21.1, 21.4, 20.1, 20.8, 21.5, 16.5)
)

Saya perlu memplot grafik batang dari data di atas menggunakan ggplot (sumbu x -> type, sumbu y -> amount, kelompokkan menurut size). Ketika saya menggunakan kode berikut, saya tidak mendapatkan variabel typedan juga sizedalam urutan yang ditunjukkan pada data. Silakan lihat gambarnya. Saya telah menggunakan kode berikut untuk itu.

 ggplot(df, aes(type, amount , fill=type, group=type, shape=type, facets=size)) + 
  geom_bar(width=0.5, position = position_dodge(width=0.6)) + 
  facet_grid(.~size) + 
  theme_bw() + 
  scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"), 
                    labels = c("T", "F", "P"))

masukkan deskripsi gambar di sini .

Untuk memperbaiki masalah pesanan, saya telah menggunakan metode faktor untuk variabel "tipe" menggunakan yang berikut ini. Silakan lihat gambarnya juga.

temp$new = factor(temp$type, levels=c("T","F","P"), labels=c("T","F","P")) 

masukkan deskripsi gambar di sini

Namun, sekarang saya tidak tahu cara memperbaiki urutan variabel size. Ini harus 50%, 100%. 150%, dan 200%.

samarasa
sumber

Jawaban:

148

Jadikan ukuran Anda sebagai faktor dalam kerangka data Anda dengan:

temp$size_f = factor(temp$size, levels=c('50%','100%','150%','200%'))

Kemudian ubah facet_grid(.~size)menjadifacet_grid(.~size_f)

Kemudian plot: masukkan deskripsi gambar di sini

Grafik sekarang dalam urutan yang benar.

Harpal
sumber
7

Inilah solusi yang menjaga segala sesuatunya dalam rantai pipa dplyr. Anda mengurutkan data terlebih dahulu, lalu menggunakan mutate_at untuk mengonversi menjadi faktor. Saya telah sedikit memodifikasi data untuk menunjukkan bagaimana solusi ini dapat diterapkan secara umum, mengingat data yang dapat diurutkan dengan bijak:

# the data
temp <- data.frame(type=rep(c("T", "F", "P"), 4),
                    size=rep(c("50%", "100%", "200%", "150%"), each=3), # cannot sort this
                    size_num = rep(c(.5, 1, 2, 1.5), each=3), # can sort this
                    amount=c(48.4, 48.1, 46.8, 
                             25.9, 26.0, 24.9,
                             20.8, 21.5, 16.5,
                             21.1, 21.4, 20.1))

temp %>% 
  arrange(size_num) %>% # sort
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>% # convert to factor

  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)

Anda juga dapat menerapkan solusi ini untuk mengatur bilah dalam faset, meskipun Anda hanya dapat memilih satu urutan yang disukai:

    temp %>% 
  arrange(size_num) %>%
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>%
  arrange(desc(amount)) %>%
  mutate_at(vars(type), funs(factor(., levels=unique(.)))) %>%
  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)


  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)
tim.farkas
sumber