2012-04-05 17 views
18

Tôi tình cờ gặp phải hành vi kỳ lạ này với lệnh ggplot2s của truyền thuyết và không thể tìm ra logic đằng sau vị trí tự động của truyền thuyết là:Đặt hàng nhiều truyền thuyết/hướng dẫn (logic tự động là gì và cách thay đổi nó?)

Mục tiêu của tôi: Trong ô có nhiều thang tôi muốn sắp xếp chúng theo thứ tự khác (theo thứ tự) so với thứ tự tự động. Nhưng tôi không thể tìm thấy một lệnh trong opts() hoặc hướng dẫn() để làm điều này cho tôi. Và chỉ cần rõ ràng: Tôi không muốn thay đổi các mục trong các truyền thuyết, nó hoạt động tốt, nhưng sự sắp xếp của nhiều truyền thuyết hoàn chỉnh.

Vì vậy, trước tiên tôi giả định rằng chúng được sắp xếp theo loại, ví dụ: tỷ lệ, màu sắc vv. Nhưng đó không phải là trường hợp, thay đổi vị trí của chúng (xem bên dưới).

Thứ tự bảng chữ cái? số

library(ggplot2) ## v0.9 

    ## Scale_colour on top 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "A") + scale_colour_discrete(name = "B") 

    ## Reverse names --> scale_colour on bottom 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "B") + scale_colour_discrete(name = "A") 

    ## Change name B to C --> scale_colour on bottom 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "C") + scale_colour_discrete(name = "A") 

    ## Change name B to D --> scale_colour on top 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "D") + scale_colour_discrete(name = "A") 

vị trí tiếp theo của scale_colour (đối với tên scale_size trao đổi)

  • "E": đáy
  • "F" - "L": top
  • "M" - "N": dưới cùng

và tiếp tục xuất hiện ở trên cùng ở dưới cùng.

Thứ tự giai thừa? No.

## From top to bottom: C - B - A 
    fname <- factor(c("A","B","C"), levels = c("A","B","C")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) + 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

    ## From top to bottom: B - C - A 
    fname <- factor(c("A","B","C"), levels = c("C","B","A")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) + 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

    ## From top to bottom: B - C - A 
    fname <- factor(c("A","B","C"), levels = c("B","C","A")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

Độ dài tiêu đề? No. Tôi sẽ dừng ngay bây giờ với mã ví dụ, nhưng điều đó cũng mang lại các đơn hàng dao động độc lập với độ dài ký tự.

Bất kỳ ý tưởng nào?

+1

Điều thú vị là, đối với tập hợp ví dụ đầu tiên của bạn, hãy thêm một khoảng trắng vào mỗi tên * làm * làm cho truyền thuyết xuất hiện theo thứ tự bảng chữ cái. (ví dụ: 'scale_size (name =" B ") + scale_colour_discrete (name =" C ")'). * Phương pháp đó, tuy nhiên, lại thất bại khi có nhiều hơn hai huyền thoại được sắp xếp ... –

+1

Tôi sẽ rất thích câu trả lời cho câu hỏi này, mặc dù tôi nghi ngờ nó sẽ yêu cầu một người như Kohske hoặc Hadley cân nhắc. Tôi không thể tìm thấy bất kỳ cuộc thảo luận nào về điều này từ danh sách gửi thư, nhưng có vẻ như một điều gì đó đáng lẽ phải xuất hiện ở một thời điểm nào đó. – joran

+0

Thật không may, bây giờ thứ tự của các hộp chú giải phụ thuộc vào 'băm' của chúng, vì vậy không có cách nào để dự đoán thứ tự ... Chắc chắn đây là ý tưởng tồi về việc triển khai của tôi. I (hoặc Hadley hoặc WCH) sẽ khắc phục sự cố này trong phiên bản sau. – kohske

Trả lời

17

Như tôi đã đề cập trong phần bình luận ở trên, không có cách nào để kiểm soát và dự đoán vị trí của hộp chú giải. Tôi không biết vấn đề này. Cảm ơn bạn đã làm rõ điều này.

Có lẽ một số người cần phải kiểm soát hộp huyền thoại, ở đây tôi đặt một sửa chữa nhanh chóng:

# run this code before calling ggplot2 function 
guides_merge <- function(gdefs) { 
    gdefs <- lapply(gdefs, function(g) { g$hash <- paste(g$order, g$hash, sep = "z"); g}) 
    tapply(gdefs, sapply(gdefs, function(g)g$hash), function(gs)Reduce(guide_merge, gs)) 
} 
environment(guides_merge) <- environment(ggplot) 
assignInNamespace("guides_merge", guides_merge, pos = "package:ggplot2") 

và sau đó bạn có thể sử dụng order luận cho guide_legend (và cũng guide_colorbar),

# specify the order of the legend. 
qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
guides(size = guide_legend(order = 1), colour = guide_legend(order = 2), alpha = guide_legend(order = 3)) 

qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
guides(size = guide_legend(order = 3), colour = guide_legend(order = 1), alpha = guide_legend(order = 2)) 

Đối số order phải là số nguyên dương. Truyền thuyết được sắp xếp theo thứ tự. Lưu ý rằng đây là bản sửa lỗi nhanh để giao diện có thể được thay đổi trong phiên bản ggplot2 chính thức tiếp theo.

+6

Kohske cung cấp một phiên bản cập nhật của câu trả lời này (sử dụng các thay đổi được thực hiện trong ggplot2 kể từ khi câu trả lời này được đưa ra) tại http://stackoverflow.com/a/11397958/892313 –

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