2012-01-03 31 views
20

Khi tôi sử dụng geom_tile() với ggplot2 và rời rạc quy mô các nhãn là thứ tự tăng dần trên trục x và thứ tự giảm dần trên trục y:ggplot2: thay đổi thứ tự hiển thị của một biến yếu tố trên một trục

#some sample data 
a <- runif(400) 
a <- matrix(a, ncol=20) 
colnames(a) <- letters[seq(from = 1, to = 20)] 
rownames(a) <- letters[seq(from = 1, to = 20)] 
a <- melt(a) 

Khi tôi vẽ những dataframe a này đi ra:

ggplot(a, aes(X1, X2, fill = value)) + geom_tile() + 
scale_fill_gradient(low = "white", high = "black", breaks=seq(from=0, to=1, by=.1), name="value") + 
opts(axis.text.x=theme_text(angle=-90, hjust=0)) + 
scale_x_discrete(name="") + scale_y_discrete(name="") 

và coords được dán nhãn khác nhau cho x và y:

enter image description here

Tôi muốn các nhãn được sắp xếp từ a-z từ trên xuống dưới và từ trái sang phải. có cách nào nhanh chóng để làm điều này?

+2

Bạn cũng có thể muốn thêm một 'giới hạn = c (0, 1)' vào lệnh 'scale_colour_gradient' hiện tại của bạn - hiện tại 1 nằm ngoài giới hạn của tỷ lệ và không được tô màu chính xác trong chú giải. – hadley

+0

@hadley: tuyệt vời cảm ơn bạn! có lẽ đó sẽ là câu hỏi thứ hai của tôi;) – Seb

+0

Làm thế nào để không đặt hàng các nhãn y? Nếu tôi có tháng ví dụ như J, F, M, A, M. Nó được sắp xếp tự động. Có thể ghi đè hành vi mặc định này không? Cảm ơn – rmf

Trả lời

30

Điểm quan trọng ở đây là thứ tự của các mức yếu tố. Thứ tự trong các cấp cũng là thứ tự trong cốt truyện. Bạn có thể sử dụng rev để đảo ngược thứ tự của các mức độ như thế này (lưu ý rằng tôi chỉ sắp xếp lại một cột trong một data.frame):

df$X1 = with(df, factor(X1, levels = rev(levels(X1)))) 

Sử dụng cú pháp này để sắp xếp lại các yếu tố của bạn khi cần thiết.

+0

cảm ơn sự giúp đỡ nhanh chóng của bạn! Nhưng điều đó không thay đổi trục x * và * y. Trục x nên giữ nguyên như vậy. Hay tôi đã hiểu sai? – Seb

+0

Bạn có thể thay đổi thứ tự các cấp cho từng biến trong data.frame riêng biệt. Chỉ cần đảo ngược những cái bạn cần. –

+0

Tôi đã chỉnh sửa câu trả lời của mình để làm rõ vấn đề này. –

4

Đối với trường hợp bạn muốn không thay đổi thứ tự của các yếu tố trong tiềm ẩn dữ liệu, bạn có thể nhận được kết quả tương tự bằng cách sử dụng limits lập luận để scale_y_discrete:

ggplot(a, aes(X1, X2, fill = value)) + 
    geom_tile() + 
    scale_y_discrete(name="", limits = rev(levels(a$X2))) 

Cho kết quả này:

enter image description here

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