33 votes

Hyperlien vers un texte dans une visualisation ggplot2

Actuellement, si je veux afficher des données dans un tableau dans R, je peux établir un lien hypertexte avec le texte via markdown, html href ou LaTeX href. C'est souvent intéressant pour donner accès à plus d'informations sur un élément particulier sans encombrer le tableau.

Comment est-il possible de donner les mêmes types de textes hyperliés dans une visualisation faite avec ggplot2 ?

Donc, par exemple, si je fais cette parcelle :

enter image description here

Avec le code ci-dessous, comment puis-je faire en sorte que le texte de l'axe soit un hyperlien vers les pages wikipedia correspondantes ?

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 votes

Sauvegarder avec quel appareil ? Il est évident que les JPEG et autres sont exclus, mais le PDF pourrait être possible grâce à la grille. Pour le web, cela pourrait être possible grâce au canevas D3.js/SVG, en utilisant peut-être ggplotly pour la conversion initiale. Je ne pense pas qu'aucune option ne sera simple, cependant.

0 votes

Je pense qu'il sera difficile d'appliquer des liens séparés au texte de l'axe tel qu'il est ( Je pense ) un seul grob, plutôt que séparés, mais les gridSVG montre comment ajouter des liens aux grobs lorsqu'ils sont affichés dans le navigateur. Ainsi, vous pouvez utiliser des grobs distincts pour les points, les étiquettes, etc. et ajouter des liens vers ceux-ci (j'ai fait un petit essai avec cela). ici )

1 votes

@alistaire Je voudrais l'utiliser dans un document knitr/rmarkdown vers pdf_document.

47voto

lukeA Points 39689

Voici une option que j'ai utilisée.

Votre exemple :

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) 

Et puis :

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"))

Si vous ouvrez tf2 dans votre navigateur :

enter image description here

Vous pouvez ensuite le convertir en un pdf (tiré du commentaire de @captcoma ci-dessous) :

library(rsvg)
rsvg_pdf(tf2, "out.pdf")

2 votes

Wow, c'est impressionnant !

0 votes

Je l'ai trouvé utile, cependant, je ne sais pas s'il fonctionne dans tous les navigateurs. Je l'ai essayé avec Chrome 56 et Firefox 50.1 sur Windows...

2 votes

C'est génial. Fonctionne dans Firefox, Safari, Chrome, Opera et Vivaldi sur MacOS.

7voto

Paul Murrell Points 96

@user20650 Voici une solution 'gridSVG' :

library(tidyverse)

links <- c('https://en.wikipedia.org/wiki/Plymouth_Duster',
           'https://de.wikipedia.org/wiki/AMC_Hornet', 
           'https://en.wikipedia.org/wiki/Mercedes-Benz_W123',
           'https://en.wikipedia.org/wiki/Plymouth_Valiant')

mtcars %>%
    rownames_to_column('car') %>%
    slice(5:8) %>%
    mutate(
        link = links
    ) %>%
    ggplot(aes(x = mpg, y = car)) +
        geom_point(size = 2)

library(grid)
## Force 'grid' grobs from 'ggplot2' plot
grid.force()
## List all grobs in plot
grid.ls()
## Find the grobs representing the text labels on the axes
tickLabels <- grid.grep("axis::text", grep=TRUE, global=TRUE)
## Check which one is the y-axis
lapply(tickLabels, function(x) grid.get(x)$label)

## Add hyperlinks to the axis tick labels
library(gridSVG)
grid.hyperlink(tickLabels[[1]],
               href=links,
               group=FALSE)
## Export to SVG (and view in a browser)
grid.export("linked-plot.svg")

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X