Как скачать сюжет ggplotly с помощью R Shiny downloadHandler? - PullRequest
0 голосов
/ 16 мая 2019

Я делаю Shiny-приложение на R. Я использую плотно, чтобы сделать мои ggplots интерактивными, поэтому у меня в приложении много графиков ggplotly. Я хотел бы иметь возможность загружать каждый из них через кнопку на интерфейсе.

Моя кнопка загрузки работает для обычных объектов ggplot, но не для объектов ggplotly. Простой воспроизводимый пример:

library(shiny)
library(ggplot2)
library(processx) # for orca()
library(plotly)

ui <- fluidPage(
  mainPanel(plotlyOutput("plot1"), downloadButton('download1', 'Download Graph'))
  )

server <- function(input,output){
  make_plot1 <- function(){
    p1 = ggplot(cars, aes(x = speed, y = dist)) + geom_point()
    return(ggplotly(p1))}

  output$plot1 <- renderPlotly({ make_plot1() }) 

  output$download1 <- downloadHandler(
    filename = function() {'plot1.png'},
    content = function(file) {
      # try 1
      png(file)
      print(make_plot1())

      # try 2
      #plotly_IMAGE(make_plot1(), format = "png", out_file = file)

      # try 3
      #orca(make_plot1(), file)

      #try 4
      #export(make_plot1(), file = file)

      dev.off()
      })
  }

shinyApp(ui, server)

Некоторые вещи, которые я пробовал, закомментированы в этом коде.

Попытка 1 основана на , как я обычно работаю с объектами печати в блестящем приложении

Try 2 основан на этот вопрос и этот пост

Try 3 основан на некоторой сюжетной документации

Try 4 основан на этот вопрос

Все эти попытки либо загружают пустой .png (попытка 1), либо просто ничего не скачивают (попытки 2-4). Я подозреваю, что я не совсем правильно использую обработчик загрузки. У кого-нибудь есть предложения, как заставить это работать?

РЕДАКТИРОВАТЬ: В этом случае я хочу .png файлы, но есть несколько хороших ответов на эту тему для загрузки интерактивных .html файлов.

Ответы [ 4 ]

1 голос
/ 16 мая 2019

Другим способом будет использование htmlwidgets для сохранения файла в виде интерактивного html, в случае, если это предпочтительнее png.

Чтобы превратить этот html в статическую графику, еще один обходной путь - если вы дляпо какой-то причине вообще не нужно использовать функцию печати plotly - было бы сохранить png с помощью webshot (для этого требуется phantomjs).Смотрите код ниже.

library("shiny")
library("ggplot2")
library("data.table")
library("plotly")
library("htmlwidgets")
library("webshot")


shinyApp(

  ui = fluidPage(

    mainPanel(plotlyOutput("plot1"),
              downloadButton('download1', 'Download Graph'))
  ),

  server = function(input, output) {

    inputPlot1 <- reactive({
      p1 = ggplot(cars, aes(x = speed, y = dist)) + geom_point()
      ggplotly(p1)
    })

    output$plot1 <- renderPlotly({
      print(inputPlot1())
    })

    output$download1 <- downloadHandler(
      filename = function() {'plot1.html'},
      content = function(file) {

      htmlwidgets::saveWidget(as_widget(inputPlot1()), file)

        # Alternative using webshot with phantomjs
        # saveWidget(as_widget(inputPlot1()), "temp.html", selfcontained = FALSE)
        # webshot(url = "temp.html", file)

      }
    )

  }

) # closes shinyApp
1 голос
/ 16 мая 2019

Вам нужно сделать это с помощью кнопки загрузки по какой-то причине? Если нет, то у plotly есть своя кнопка на панели мод, которая загружает в PNG.

enter image description here

Приборная панель взята с https://plot.ly/r/dashboard/.

На форуме поддержки plotly (https://community.plot.ly/t/remove-options-from-the-hover-toolbar/130/3), вы можете использовать config() для удаления других компонентов.

make_plot1 <- function() {
  p1 = ggplot(cars, aes(x = speed, y = dist)) + geom_point()
  p1 = ggplotly(p1) %>%
    config(
      modeBarButtonsToRemove = list(
        "zoom2d",
        "pan2d",
        "zoomIn2d",
        "zoomOut2d",
        "autoScale2d",
        "resetScale2d",
        "hoverClosestCartesian",
        "hoverCompareCartesian",
        "sendDataToCloud",
        "toggleHover",
        "resetViews",
        "toggleSpikelines",
        "resetViewMapbox"
      ),
      displaylogo = FALSE
    )
  return(p1)
}

Вы также можете переместить панель мод, чтобы она не закрывала график, используя CSS.

.modebar {
    top: -30px !important;
}
0 голосов
/ 17 мая 2019

Если вы хотите загрузить графики ggplotly с интерактивной функцией, попробуйте this .

0 голосов
/ 16 мая 2019

После вашего комментария к ответу Вила вы можете удалить ненужные кнопки на панели мод следующим образом:

library(plotly)

x <- c(1:15)
y <- c(1:15)
xy <- as.data.frame(cbind(x,y))
example <- ggplot(data = xy,aes(x = x,y = y)) + geom_line()

ggplotly(example) %>% 
  config(displaylogo = FALSE,
         collaborate = FALSE,
         modeBarButtonsToRemove = list(
           'sendDataToCloud',
           'autoScale2d',
           'resetScale2d',
           'hoverClosestCartesian',
           'hoverCompareCartesian',
           'zoom2d', 
           'pan2d',
           'select2d',
           'lasso2d',
           'zoomIn2d', 
           'zoomOut2d',
           'toggleSpikelines'
         )
  )

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...