Sửa thứ tự của các khía cạnh trong ggplot


96

Dữ liệu:

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)
)

Tôi cần vẽ biểu đồ thanh của dữ liệu trên bằng ggplot (trục x -> type, trục y -> amount, nhóm theo size). Khi tôi sử dụng mã sau, tôi không nhận được biến typevà cũng như sizetheo thứ tự được hiển thị trong dữ liệu. Vui lòng xem hình. Tôi đã sử dụng mã sau cho điều đó.

 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"))

nhập mô tả hình ảnh ở đây .

Để khắc phục sự cố thứ tự, tôi đã sử dụng phương pháp nhân tố cho biến "loại" bằng cách sử dụng như sau. Vui lòng xem thêm hình.

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

nhập mô tả hình ảnh ở đây

Tuy nhiên, bây giờ tôi không biết làm thế nào để sửa thứ tự cho biến size. Nó phải là 50%, 100%. 150% và 200%.

Câu trả lời:


147

Đặt kích thước của bạn thành một yếu tố trong khung dữ liệu của bạn bằng cách:

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

Sau đó, thay đổi facet_grid(.~size)thànhfacet_grid(.~size_f)

Sau đó, âm mưu: nhập mô tả hình ảnh ở đây

Các đồ thị hiện đang theo đúng thứ tự.


7

Đây là một giải pháp giữ mọi thứ trong một chuỗi ống dplyr. Bạn sắp xếp dữ liệu trước, sau đó sử dụng mutate_at để chuyển đổi thành một thừa số. Tôi đã sửa đổi dữ liệu một chút để cho thấy cách giải pháp này có thể được áp dụng chung, với dữ liệu có thể được sắp xếp hợp lý:

# 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)

Bạn cũng có thể áp dụng giải pháp này để sắp xếp các thanh theo các khía cạnh, mặc dù bạn chỉ có thể chọn một thứ tự ưu tiên duy nhất:

    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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.