2017-02-15 15 views
10

Hiện tại nếu tôi muốn hiển thị dữ liệu trong bảng trong R, tôi có thể siêu liên kết văn bản qua markdown, html href hoặc LaTeX href. Điều này thường tốt cho việc truy cập vào thông tin thêm về một yếu tố cụ thể w/o lộn xộn bảng.Văn bản siêu liên kết trong hình ảnh ggplot2

Làm cách nào để có thể cung cấp cùng một loại văn bản siêu liên kết trong một hình ảnh được tạo bằng ggplot2?

Vì vậy, ví dụ nếu tôi làm cho âm mưu này:

enter image description here

Với mã dưới đây, làm thế nào tôi có thể làm cho các siêu liên kết văn bản trục đến các trang wikipedia tương ứng?

library(tidyverse) 

mtcars %>% 
    rownames_to_column('car') %>% 
    slice(5:8) %>% 
    mutate(
     link = c(
      'https://de.wikipedia.org/wiki/AMC_Hornet', 
      'https://en.wikipedia.org/wiki/Plymouth_Valiant', 
      'https://en.wikipedia.org/wiki/Plymouth_Duster', 
      'https://en.wikipedia.org/wiki/Mercedes-Benz_W123' 
     ) 
    ) %>% 
    ggplot(aes(x = mpg, y = car)) + 
     geom_point(size = 2) 
+2

Tiết kiệm với thiết bị gì? Rõ ràng là JPEG và như vậy là ra ngoài, nhưng PDF có thể có thể thông qua lưới. Đối với web, nó có thể có thể thông qua canvas D3.js/SVG, có thể sử dụng 'ggplotly' cho chuyển đổi ban đầu. Tôi không nghĩ rằng bất kỳ tùy chọn sẽ được đơn giản, mặc dù. – alistaire

+0

Tôi nghĩ sẽ rất khó để áp dụng các liên kết riêng biệt với văn bản trục như (* i nghĩ *) một grob, thay vì tách biệt, nhưng gói 'gridSVG' hiển thị các cách để thêm liên kết vào grobs khi được xem trong trình duyệt. Vì vậy, bạn có thể sử dụng các rãnh riêng biệt cho các điểm, nhãn vv và thêm các liên kết vào các mục này (Tôi đã có một wee đi với điều này [ở đây] (http://chat.stackoverflow.com/rooms/135813/gridsvg)) – user20650

+0

@alistaire I ' d muốn sử dụng nó trong một knitr/rmarkdown để pdf_document –

Trả lời

11

Dưới đây là một tùy chọn mà tôi đã sử dụng.

dụ của bạn:

library(tidyverse) 
library(xml2) 
df <- mtcars %>% 
    rownames_to_column('car') %>% 
    slice(5:8) %>% 
    mutate(
    link = c(
     'https://de.wikipedia.org/wiki/AMC_Hornet', 
     'https://en.wikipedia.org/wiki/Plymouth_Valiant', 
     'https://en.wikipedia.org/wiki/Plymouth_Duster', 
     'https://en.wikipedia.org/wiki/Mercedes-Benz_W123' 
    ) 
) 
p <- df %>% 
    ggplot(aes(x = mpg, y = car)) + 
    geom_point(size = 2) 

Và sau đó:

ggsave(tf1 <- tempfile(fileext = ".svg"), p) 
links <- with(df, setNames(link, car)) 

xml <- read_xml(tf1) 
xml %>% 
    xml_find_all(xpath="//d1:text") %>% 
    keep(xml_text(.) %in% names(links)) %>% 
    xml_add_parent("a", "xlink:href" = links[xml_text(.)], target = "_blank") 
write_xml(xml, tf2 <- tempfile(fileext = ".svg")) 

Nếu bạn mở tf2 trong trình duyệt của bạn:

enter image description here

+2

Wow, điều này thật ấn tượng! – Gregor

+0

Tôi thấy nó hữu ích, tuy nhiên, tôi không biết nếu nó hoạt động trong tất cả các trình duyệt. Tôi đã thử với Chrome 56 và Firefox 50.1 trên Windows ... – lukeA

+2

Điều này thật tuyệt vời. Hoạt động trong Firefox, Safari, Chrome, Opera và Vivaldi trên MacOS. – alistaire

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