如何使用 R Shiny downloadHandler 下载 ggplotly 图?
How to download a ggplotly plot with R Shiny downloadHandler?
我正在 R 中制作一个闪亮的应用程序。我使用 plotly 使我的 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 基于
尝试 2 基于 this question and this post
尝试 3 基于 some plotly documentation
尝试 4 基于 this question
所有这些尝试要么下载空白 .png(尝试 1),要么根本无法下载任何内容(尝试 2-4)。我怀疑我没有正确使用下载处理程序。有没有人对这个工作有建议?
编辑:在这种情况下,我想要 .png 文件,但是在这个线程上有一些很好的答案可以下载交互式 .html 文件。
您是否出于某种原因需要使用下载按钮来完成此操作?如果没有,plotly 在模式栏中有自己的按钮,可以下载到 PNG。
仪表板取自 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;
}
根据您对 Wil 的回答的评论,您可以删除模式栏中不需要的按钮,如下所示:
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'
)
)
参考文献:
另一种方法是使用 htmlwidgets 将文件另存为交互式 html,以防比 png 更可取。
要将此 html 变成静态图形,进一步的解决方法 - 如果您出于某种原因根本不想使用 plotly 的打印功能 - 将保存带有 webshot 的 png(这需要 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
如果您想下载具有交互功能的 ggplotly 图表,请尝试 。
我正在 R 中制作一个闪亮的应用程序。我使用 plotly 使我的 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 基于
尝试 2 基于 this question and this post
尝试 3 基于 some plotly documentation
尝试 4 基于 this question
所有这些尝试要么下载空白 .png(尝试 1),要么根本无法下载任何内容(尝试 2-4)。我怀疑我没有正确使用下载处理程序。有没有人对这个工作有建议?
编辑:在这种情况下,我想要 .png 文件,但是在这个线程上有一些很好的答案可以下载交互式 .html 文件。
您是否出于某种原因需要使用下载按钮来完成此操作?如果没有,plotly 在模式栏中有自己的按钮,可以下载到 PNG。
仪表板取自 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;
}
根据您对 Wil 的回答的评论,您可以删除模式栏中不需要的按钮,如下所示:
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'
)
)
参考文献:
另一种方法是使用 htmlwidgets 将文件另存为交互式 html,以防比 png 更可取。
要将此 html 变成静态图形,进一步的解决方法 - 如果您出于某种原因根本不想使用 plotly 的打印功能 - 将保存带有 webshot 的 png(这需要 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
如果您想下载具有交互功能的 ggplotly 图表,请尝试