简体   繁体   中英

R open plotly in standalone window

I would like to display a plotly plot object in a standalone window that behaves similarly to the window that pops up using the base R plot() function.

Using a basic example from the plotly website:

library(ggplot2)
library(plotly)

d <- diamonds[sample(nrow(diamonds), 1000), ]
p <- ggplot(data = d, aes(x = carat, y = price)) +
     geom_point(aes(text = paste("Clarity:", clarity))) +
     geom_smooth(aes(colour = cut, fill = cut)) + facet_wrap(~ cut)

p2 <- ggplotly(p)

The p2 object is an htmlwidget object and I get some control over its display using the sizingPolicy element as described here . However, I can't find anything that allows me to set the viewer/browser to something other than my current browser (as a new tab) or within RStudio.

Ideally, I'd like to avoid applications outside of R packages to launch a separate window from within R. However, I would also be happy with figuring out how to granularly control browser output to display p2 as a new window in kiosk or app mode (see the answers to this question for some examples of kiosk/app mode).

Edit: Although I mentioned RStudio when discussing some of the options that I was able to find, I am talking about using R from a simple console. That said, granular display options should hopefully be independent of the user interface.

I have a working solution, but I'll be happy to change the accepted answer if someone has anything better.

I defined a print function that can be used to launch a custom browser command for an htmlwidget object. In this case, I used chromium-browser -app=... , but the overall approach should be general.

print_app <- function(widget) {

  # Generate random file name
  temp <- paste(tempfile('plotly'), 'html', sep = '.')

  # Save. Note, leaving selfcontained=TRUE created files that froze my browser
  htmlwidgets::saveWidget(widget, temp, selfcontained = FALSE)

  # Launch with desired application
  system(sprintf("chromium-browser -app=file://%s", temp))

  # Return file name if it's needed for any other purpose
  temp
}

Combining with the previous example:

library(ggplot2)
library(plotly)

d <- diamonds[sample(nrow(diamonds), 1000), ]
p <- ggplot(data = d, aes(x = carat, y = price)) +
     geom_point(aes(text = paste("Clarity:", clarity))) +
     geom_smooth(aes(colour = cut, fill = cut)) + facet_wrap(~ cut)

p2 <- ggplotly(p)
print_app(p2)

It seems like htmlwidgets normally uses the html_print function from htmltools , which in turn selects the browser to use via getOption("viewer", utils::browseURL) , which bakes in a lot of the browser selection options -- making it challenging to change.

The idea for saving the html file locally came from this plotly issue: saving plotly plots locally? .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM