2016-02-03 17 views
13

Tôi có tập dữ liệu, trong đó mỗi điểm dữ liệu có giá trị x bị hạn chế (đại diện cho một phiên bản thực tế của biến định lượng) là tùy ý (tồn tại chỉ đơn giản là cung cấp thứ nguyên để trải rộng văn bản) và nhãn. Bộ dữ liệu của tôi có thể rất lớn và thường có chồng chéo văn bản, ngay cả khi tôi cố gắng trải rộng dữ liệu trên trục y càng nhiều càng tốt.ggrepel: Chỉ định lại văn bản theo một hướng và trả về giá trị của văn bản bị đẩy lùi

Do đó, tôi đang cố gắng sử dụng ggrepel mới. Tuy nhiên, tôi đang cố gắng giữ cho các nhãn văn bản bị hạn chế ở vị trí x-value của chúng, trong khi chỉ cho phép chúng đẩy lùi nhau theo hướng y. Ví dụ, mã dưới đây tạo ra một âm mưu cho 32 điểm dữ liệu, trong đó các giá trị x hiển thị số lượng xi lanh trong ô tô và các giá trị y được xác định ngẫu nhiên (không có ý nghĩa nhưng để cung cấp một giây kích thước cho mục đích vẽ bản đồ). Mà không sử dụng ggrepel, có sự chồng chéo đáng kể trong văn bản:

library(ggrepel) 
library(ggplot2) 
set.seed(1) 
data = data.frame(x=runif(100, 1, 10),y=runif(100, 1, 10),label=paste0("label",seq(1:100))) 
origPlot <- ggplot(data) + 
    geom_point(aes(x, y), color = 'red') + 
    geom_text(aes(x, y, label = label)) + 
    theme_classic(base_size = 16) 

Original plot

tôi có thể khắc phục sự chồng chéo văn bản sử dụng ggrepel, như hình dưới đây. Tuy nhiên, điều này không chỉ thay đổi giá trị y, mà còn thay đổi giá trị x. Tôi cố gắng để tránh thay đổi x giá trị, vì họ đại diện cho một ý nghĩa vật lý thực tế (số lượng xi lanh):

repelPlot <- ggplot(data) + 
    geom_point(aes(x, y), color = 'red') + 
    geom_text_repel(aes(x, y, label = label)) + 
    theme_classic(base_size = 16) 

enter image description here

Là một lưu ý, lý do tôi không thể cho phép x-giá trị của văn bản cần thay đổi là vì tôi chỉ vẽ văn bản (không phải là điểm). Trong khi đó, có vẻ như hầu hết các ví dụ trong ggrepel giữ vị trí của các điểm (để giá trị của chúng vẫn đúng), và chỉ đẩy lùi các giá trị x và y của các nhãn. Sau đó, các điểm và kết nối với các nhãn với các phân đoạn (bạn có thể thấy rằng trong ví dụ cốt truyện thứ hai của tôi).

Tôi giữ các điểm trong hai ví dụ trên cho mục đích minh họa. Tuy nhiên, tôi chỉ giữ lại văn bản (và do đó sẽ được loại bỏ các điểm và các đoạn), để lại tôi với một cái gì đó như thế này:

repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0) + theme_classic(base_size = 16) 

enter image description here

Câu hỏi của tôi là hai lần:

1) Tôi có thể đẩy lùi nhãn văn bản theo hướng y không?

2) Tôi có thể lấy cấu trúc chứa các giá trị y mới (bị đẩy lùi) của văn bản không?

Cảm ơn bạn đã được tư vấn!

+0

Tôi không hiểu cách giải quyết vấn đề này? Cảm ơn bạn. – luckButtered

Trả lời

4

ggrepel phiên bản 0.6.8 (Cài đặt từ GitHub sử dụng DevTools :: github_install) bây giờ hỗ trợ một "hướng" lập luận, cho phép chất chống thấm của nhãn chỉ trong "x" hoặc hướng "y" .

repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0, direction = "y") + theme_classic(base_size = 16)

Bắt các giá trị y là khó khăn hơn - một cách tiếp cận có thể sử dụng "repel_boxes" chức năng từ ggrepel đầu tiên để có được giá trị đẩy lùi và sau đó đầu vào những thành ggplot với geom_text. Để thảo luận và lấy mẫu mã của phương pháp đó, hãy xem https://github.com/slowkow/ggrepel/issues/24. Lưu ý rằng nếu sử dụng phiên bản mới nhất, hàm repel_boxes bây giờ cũng có đối số "hướng", sẽ lấy "cả hai", "x" hoặc "y".

5

Tôi không nghĩ rằng chỉ có thể đẩy lùi nhãn văn bản theo một hướng với ggrepel.

Tôi sẽ tiếp cận vấn đề này một cách khác nhau, bằng cách thay thế tạo các vị trí trục y tùy ý theo cách thủ công. Ví dụ: đối với tập dữ liệu trong ví dụ của bạn, bạn có thể thực hiện việc này bằng cách sử dụng mã bên dưới.

Tôi đã sử dụng gói dplyr để nhóm nhóm dữ liệu theo giá trị x và sau đó tạo cột dữ liệu mới y chứa số hàng trong mỗi nhóm. Các số hàng sau đó được sử dụng làm giá trị cho trục y.

library(ggplot2) 
library(dplyr) 

data <- data.frame(x = mtcars$cyl, label = paste0("label", seq(1:32))) 

data <- data %>% 
    group_by(x) %>% 
    mutate(y = row_number()) 

ggplot(data, aes(x = x, y = y, label = label)) + 
    geom_text(size = 2) + 
    xlim(3.5, 8.5) + 
    theme_classic(base_size = 8) 

ggsave("filename.png", width = 4, height = 2) 

enter image description here

+0

Tôi nhận ra câu hỏi của tôi vô tình gây hiểu nhầm. Trong tập dữ liệu thực sự của tôi, các giá trị x là liên tục (không rời rạc, như tôi đã thực hiện MWE của tôi). Vì vậy, khi tôi áp dụng giải pháp của bạn, nó không giải quyết được vấn đề. Tôi đang chỉnh sửa sai lầm của mình, và nếu tôi không nghe một giải pháp cho câu hỏi của tôi (rõ ràng hơn), thì tôi cũng sẽ chọn câu trả lời hiện tại của bạn. Cảm ơn bạn. – luckButtered

+0

Tôi thực sự đã áp dụng một giải pháp tương tự, ban đầu, cho những gì bạn đã làm. Ngoại trừ tôi đã nhóm nhãn thành các thùng có giá trị x tương tự. Vẫn còn chồng chéo đáng kể trong một tập dữ liệu với nhiều nhãn, và đó là khi tôi chuyển sang ggrepel. – luckButtered

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