2013-01-31 39 views
5

Tôi muốn vẽ một âm mưu ggplot2 chấm. trục x là liên tục, trục y là danh sách động vật. Hai biến được vẽ và mặt theo hành vi ăn uống.ggplot2: Đảo ngược thứ tự của biến ký tự rời rạc cho từng khía cạnh trên thang điểm tự do?

Trục y ở quy mô miễn phí vì mỗi động vật chỉ xuất hiện trong một danh mục hành vi ăn uống.

library(ggplot2) 

# First clean up the data set: 
msleep.noNA <- msleep[!is.na(msleep$vore),] 
msleep.noNA.red <- msleep.noNA[c(1,3,6,7)] 
msleep.noNA.red <- msleep.noNA.red[!is.na(msleep.noNA.red[4]),] 
msleep.noNA.red <- melt(msleep.noNA.red) 

pg <- ggplot(msleep.noNA.red, aes(value, name, colour = variable)) + 
     geom_point() + 
     facet_grid(vore ~ ., scale="free_y", space = "free_y") 
pg 

# Try to reverse order of the y axis: 
pg + scale_y_reverse() 

# Not possible because its a factor, but it's not classified as such: 
class(msleep.noNA.red$name) 

Có ai có một số manh mối như thế nào tôi có thể làm cho danh sách các tên động vật chữ cái trong mỗi phụ âm mưu?

+0

bạn có thể dán dữ liệu của bạn (tốt nhất là sử dụng 'dput') để chúng tôi có thể làm việc để tái tạo mã của bạn? – Arun

+1

Xin chào Arun, Cảm ơn bạn đã bình luận. bộ dữ liệu msleep có sẵn như là một phần của ggplot2. Tất cả các lệnh sẽ hoạt động trên nền tảng có cài đặt ggplot2. –

+1

Bạn có thể chuyển đổi mọi thứ thành một yếu tố bằng cách sử dụng 'as.factor', vì vậy' msleep.noNA.red $ name <- as.factor (msleep.noNA.red $ name) 'sẽ biến nó thành một nhân tố và sau đó bạn có thể làm việc với nó như bạn sẽ làm bất kỳ yếu tố nào khác. cái đó có giúp ích không? –

Trả lời

8

Bạn có thể chuyển đổi chuỗi vectơ thành một yếu tố và chỉ định thứ tự các cấp:

Lệnh sau sẽ tạo ra một yếu tố. Mức được trong việc giảm thứ tự chữ cái:

msleep.noNA.red <- within(msleep.noNA.red, 
         name <- ordered(name, levels = rev(sort(unique(name))))) 

Bây giờ bạn có thể vẽ đồ thị dữ liệu:

pg <- ggplot(msleep.noNA.red, aes(value, name, colour = variable)) + 
    geom_point() + 
    facet_grid(vore ~ ., scale="free_y", space = "free_y") 

enter image description here

+0

Cảm ơn bạn! Đúng vậy! –

+0

Không cần 'order()' ở đây, plain old 'factor()' hoạt động tốt. – Gregor

+2

Nếu bạn không muốn thay đổi dataframe cơ bản, bạn có thể làm 'scale_y_discrete (limits = rev (các cấp (msleep.noNA.red $ name)))' thay vì 'scale_y_reverse()', và nó sẽ hoạt động. –

Các vấn đề liên quan