manu p
manu p

Reputation: 985

Export raw data in Excel in plotly

Is there a way to export raw data in the form of excel in plotly graph. Example

asd <- data.frame(week = c(1,2,3), a = c(12,41,33), b = c(43,21,23), c = c(43,65,43), d = c(33,45,83))

plot_ly(asd, x = ~week, y = ~`a`, name = 'a', type = 'scatter', mode = 'lines') %>%  
  add_trace(y = ~`b`, name = 'b', mode = 'lines') %>% 
  layout(xaxis = list(title = paste0("Week"),showgrid = F,rangemode = "normal"), 
         yaxis = list(title = "",showgrid = F,rangemode = "normal"),
         hovermode = 'x unified')

We can down the static image in png. But we cannot down load the raw data behind the graph. Can we download it? So basically, data in asd should be downloaded

Upvotes: 2

Views: 852

Answers (2)

St&#233;phane Laurent
St&#233;phane Laurent

Reputation: 84519

Too get an XLS/XLSX file, one would need a library. Here is a way to export to a CSV file. This only exports the visible data.

library(plotly)

asd <- data.frame(
  week = c(1, 2, 3), 
  a = c(12, 41, 33), 
  b = c(43, 21, 23), 
  c = c(43, 65, 43), 
  d = c(33, 45, 83)
)

js <- c(
  'function(gd) {',
  '  var text = "";',
  '  for (var i = 0; i < gd.data.length; i++) {',
  '    var data = gd.data[i];',
  '    text +=',
  '      gd.layout.xaxis.title.text + data.name + "," + data.x + "\\n";',
  '    text +=',
  '      gd.layout.yaxis.title.text + data.name + "," + data.y + "\\n";',
  '  }',
  '  var blob = new Blob([text], { type: "text/plain" });',
  '  var a = document.createElement("a");',
  '  const object_URL = URL.createObjectURL(blob);',
  '  a.href = object_URL;',
  '  a.download = "data.csv";',
  '  document.body.appendChild(a);',
  '  a.click();',
  '  URL.revokeObjectURL(object_URL);',
  '}'
)

CSV_SVGpath <- "M284.1,150.5V31H108.3c-11.7,0-21.1,9.4-21.1,21.1v407.8c0,11.7,9.4,21.1,21.1,21.1h295.3c11.7,0,21.1-9.4,21.1-21.1V171.6 H305.2C293.6,171.6,284.1,162.1,284.1,150.5z M199.8,277.1c0,3.9-3.1,7-7,7h-7c-7.8,0-14.1,6.3-14.1,14.1v28.1 c0,7.8,6.3,14.1,14.1,14.1h7c3.9,0,7,3.1,7,7v14.1c0,3.9-3.1,7-7,7h-7c-23.3,0-42.2-18.9-42.2-42.2v-28.1 c0-23.3,18.9-42.2,42.2-42.2h7c3.9,0,7,3.1,7,7V277.1z M238.7,368.5h-10.8c-3.9,0-7-3.1-7-7v-14.1c0-3.9,3.1-7,7-7h10.8 c5.2,0,9.1-3.1,9.1-5.8c0-1.1-0.7-2.3-1.9-3.4l-19.2-16.5c-7.4-6.3-11.7-15.4-11.7-24.7c0-18.7,16.7-33.9,37.3-33.9H263 c3.9,0,7,3.1,7,7v14.1c0,3.9-3.1,7-7,7h-10.8c-5.2,0-9.1,3.1-9.1,5.8c0,1.1,0.7,2.3,1.9,3.4l19.2,16.5c7.4,6.3,11.7,15.4,11.7,24.7 C275.9,353.3,259.2,368.5,238.7,368.5L238.7,368.5z M312.2,263v18.3c0,17.8,5,35.3,14.1,50c9.1-14.7,14.1-32.2,14.1-50V263 c0-3.9,3.1-7,7-7h14.1c3.9,0,7,3.1,7,7v18.3c0,31.2-11.3,60.5-31.9,82.7c-2.7,2.9-6.4,4.5-10.3,4.5s-7.6-1.6-10.3-4.5 c-20.6-22.1-31.9-51.5-31.9-82.7V263c0-3.9,3.1-7,7-7h14.1C309.1,256,312.2,259.1,312.2,263z M418.6,123.3l-86-86.1 c-4-4-9.3-6.2-14.9-6.2h-5.4v112.5h112.5v-5.4C424.8,132.6,422.6,127.2,418.6,123.3z" 

CSVexport <- list(
  name = "CSV",
  icon = list(
    path = CSV_SVGpath,
    width = 512,
    height = 512
  ),
  click = htmlwidgets::JS(js)
)

plot_ly(
  asd, x = ~week, y = ~`a`, name = "a", type = "scatter", mode = "lines"
) %>%
  add_trace(y = ~`b`, name = "b", mode = "lines") %>%
  layout(
    xaxis = list(title = "Week", showgrid = FALSE, rangemode = "normal"),
    yaxis = list(title = "", showgrid = FALSE, rangemode = "normal"),
    hovermode = "x unified"
  ) %>%
  config(modeBarButtonsToAdd = list(CSVexport))

Upvotes: 3

Abdur Rohman
Abdur Rohman

Reputation: 2944

You can get the data used in the graph by using plotly_data function.

myplot <- plot_ly(asd, x = ~week, y = ~`a`, name = 'a', type = 'scatter', mode = 'lines') %>%  
  add_trace(y = ~`b`, name = 'b', mode = 'lines') %>% 
  layout(xaxis = list(title = paste0("Week"),showgrid = F,rangemode = "normal"), 
         yaxis = list(title = "",showgrid = F,rangemode = "normal"),
         hovermode = 'x unified')

plotly_data(myplot)
# A tibble: 3 x 5
#   week     a     b     c     d
#  <dbl> <dbl> <dbl> <dbl> <dbl>
#1     1    12    43    43    33
#2     2    41    21    65    45
#3     3    33    23    43    83

Upvotes: 1

Related Questions