2010-11-19 31 views
16

Tôi đang cố gắng sử dụng geom_point để minh họa số lượng dữ liệu của mình. Tôi cũng muốn chú thích một vài điểm trong biểu đồ của mình với geom_text. Khi tôi thêm cuộc gọi vào geom_text, có vẻ như nó đang vẽ đồ thị bên dưới các điểm trong chú giải. Tôi đã cố gắng đảo ngược thứ tự của các lớp để không có kết quả. Tôi không thể quấn đầu xung quanh tại sao nó lại làm điều này. Có ai thấy điều này trước đây không?vấn đề huyền thoại ggplot w/geom_point và geom_text

set.seed(42) 
df <- data.frame(x = 1:10 
    , y = 1:10 
    , label = sample(LETTERS,10, replace = TRUE) 
    , count = sample(1:300, 10, replace = FALSE) 
) 

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2)) 

alt text

Trả lời

24

này xảy ra với tôi tất cả các thời gian. Bí quyết là biết rằng aes() ánh xạ dữ liệu đến thẩm mỹ. Nếu không có dữ liệu để ánh xạ (ví dụ: nếu bạn có một giá trị duy nhất mà bạn xác định), không có lý do gì để sử dụng aes(). Tôi tin rằng chỉ những thứ bên trong của aes() mới xuất hiện trong huyền thoại của bạn.

Ngoài ra, khi bạn chỉ định ánh xạ bên trong ggplot(aes()), các ánh xạ đó áp dụng cho mỗi lớp tiếp theo. Điều đó tốt cho x và y của bạn, vì cả hai geom_pointgeom_text đều sử dụng chúng. Điều đó không tốt cho size = count, vì điều đó chỉ áp dụng cho các điểm.

Vì vậy, đây là hai quy tắc của tôi để ngăn chặn loại điều:

  1. Chỉ đưa ánh xạ dựa trên dữ liệu bên trong của aes(). Nếu đối số đang lấy một giá trị được xác định trước, hãy chuyển nó đến lớp bên ngoài của aes().
  2. Dữ liệu bản đồ chỉ dành cho những lớp sẽ sử dụng nó. Hệ quả: chỉ có dữ liệu bản đồ bên trong của ggplot(aes()) nếu bạn tin tưởng rằng mọi lớp tiếp theo sẽ sử dụng nó. Nếu không, ánh xạ nó ở cấp lớp.

Vì vậy, tôi sẽ vẽ này thusly:

p <- ggplot(data = df, aes(x = x, y = y)) + geom_point(aes(size = count)) 
p + geom_text(aes(label = label), size = 4, vjust = 2) 
+2

Hai quy tắc của bạn là thích hợp! – kohske

+0

Các mẹo rất hữu ích để biết về tương lai, tôi vẫn đang cố gắng tập trung đầu óc vào các phương pháp hay nhất w/ggplot2. Bạn có bất cứ đề nghị cho subsetting đối tượng dữ liệu để âm mưu? Ví dụ: nếu bạn chỉ muốn chú thích điểm đầu tiên và điểm cuối cùng? Tôi đã sử dụng một cái gì đó như 'geom_text (dữ liệu = df [grep (" xxx ", df $ nhãn),], aes (x = ...))'. Có cách nào tốt hơn để thực hiện điều đó không? – Chase

+0

Chase - đó là một câu hỏi hay. Nó có thể là khôn ngoan để làm cho một câu hỏi mới ra khỏi nó; Tôi có một số khái niệm mơ hồ, nhưng rất có thể ai đó khác có ý tưởng cụ thể. –

17

hoặc, nếu bạn cần phải xác định kích thước của văn bản bên trong aes, sau đó huyền thoại = FALSE suppress vẽ những huyền thoại của Geom:

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2), show_guide = FALSE) 
+1

Ah, nó không bao giờ xảy ra với tôi để sử dụng nó ở cấp lớp. Thực hiện tốt. –

+0

Đó là một mẹo hay để biết! Cảm ơn. – Chase

+2

Chỉ một thông tin nhỏ: "chú giải" đã được thay thế bằng "show_guides": đối số "chú thích" trong geom_XXX và stat_XXX không được chấp nhận. Sử dụng show_guide = TRUE hoặc show_guide = FALSE để hiển thị hoặc ngăn hiển thị hướng dẫn. " – Andreas

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