Home > database >  Ggplotly clickable link in R plot
Ggplotly clickable link in R plot

Time:04-11

I would like to click a link in R plotly - it means when you click on a certain point in the plot you will be redirected to the web page. Is it possible in R with ggplotly or is there any similar solution? You may reproduce my plot with the following code:


# Data frame
data <- data.frame(check.names = FALSE,
  `price` = c(6790000, 6950000, 5990000, 5990000, 4150000, 8654100),
  `rooms` = c("4 1", "3 1", "2 kk", "2 1", "1 kk", "4 1"),
  `m2` = c(78, 78, 58, 52, 30, 100),
  `location` = c("Bohunice", "Bystrc", "Plotni", "Lesna", "Styrice", "Zabrdovice"),
  `link` = c("https://www.sreality.cz/detail/prodej/byt/4 1/brno-bohunice-moldavska/2155567196", 
             "https://www.sreality.cz/detail/prodej/byt/3 1/brno-bystrc-cerneho/2881087836", 
             "https://www.sreality.cz/detail/prodej/byt/2 kk/brno--plotni/2840209756", 
             "https://www.sreality.cz/detail/prodej/byt/2 1/brno-lesna-triskalova/2905770332", 
             "https://www.sreality.cz/detail/prodej/byt/1 kk/brno-styrice-videnska/3682412892", 
             "https://www.sreality.cz/detail/prodej/byt/4 1/brno-zabrdovice-kornerova/2548312156"
  )
)

# CLEAN DATA
library(ggplot2)
library(plotly)
g <- ggplot(data, aes(x=m2, y=price, 
                    text = paste0("Type: ", rooms, "\n",
                                  "Price: ", price, "\n",
                                  "M2: ", m2, "\n",
                                  "Location: ", location, "\n", 
                                  "Link: ", link)))  
  geom_point(aes(fill=rooms), color='black', size=3, alpha=0.9)  
  theme_minimal()  
  scale_x_continuous(breaks = seq(min(0), max(350), by=50))  
  scale_y_continuous(breaks = seq(min(0), max(40000000), by=2000000))  
  theme(
    legend.title = element_blank())

ggplotly(g, tooltip = c("text"))

CodePudding user response:

Following chapter 21 of the R plotly book you could achieve your desired result by passing the link via the customdata attribute and adding a custom event handler via ´htmlwidgets::onRender`. For the custom event handler you could simply use the JS code from the referenced link.

# Data frame
data <- data.frame(
  check.names = FALSE,
  `price` = c(6790000, 6950000, 5990000, 5990000, 4150000, 8654100),
  `rooms` = c("4 1", "3 1", "2 kk", "2 1", "1 kk", "4 1"),
  `m2` = c(78, 78, 58, 52, 30, 100),
  `location` = c("Bohunice", "Bystrc", "Plotni", "Lesna", "Styrice", "Zabrdovice"),
  `link` = c(
    "https://www.sreality.cz/detail/prodej/byt/4 1/brno-bohunice-moldavska/2155567196",
    "https://www.sreality.cz/detail/prodej/byt/3 1/brno-bystrc-cerneho/2881087836",
    "https://www.sreality.cz/detail/prodej/byt/2 kk/brno--plotni/2840209756",
    "https://www.sreality.cz/detail/prodej/byt/2 1/brno-lesna-triskalova/2905770332",
    "https://www.sreality.cz/detail/prodej/byt/1 kk/brno-styrice-videnska/3682412892",
    "https://www.sreality.cz/detail/prodej/byt/4 1/brno-zabrdovice-kornerova/2548312156"
  )
)

library(ggplot2)
library(plotly)
library(htmlwidgets)

g <- ggplot(data, aes(
  x = m2, y = price,
  text = paste0(
    "Type: ", rooms, "\n",
    "Price: ", price, "\n",
    "M2: ", m2, "\n",
    "Location: ", location
  ),
  customdata = link
))  
  geom_point(aes(fill = rooms), color = "black", size = 3, alpha = 0.9)  
  theme_minimal()  
  scale_x_continuous(breaks = seq(min(0), max(350), by = 50))  
  scale_y_continuous(breaks = seq(min(0), max(40000000), by = 2000000))  
  theme(
    legend.title = element_blank()
  )

p <- ggplotly(g, tooltip = c("text"))

onRender(
  p, "
  function(el) {
    el.on('plotly_click', function(d) {
      var url = d.points[0].customdata;
      window.open(url);
    });
  }
"
)

  • Related