【问题标题】:Embed plotly into PDF rmarkdown嵌入到 PDF rmarkdown
【发布时间】:2019-08-20 20:41:59
【问题描述】:

我在ggplot 饼图中遇到了重叠标签的原始问题,因此 SO 建议我改用 plotly。这解决了我的标签重叠问题,但现在我需要找到一种方法将plotly 图表嵌入到我的 PDF 文档中。

使用我之前的 ggplot,我可以只使用 'print(piechart, floating = FALSE),但它不会出现在 plotly 中。

---
title: "Untitled"
author: "Morg"
date: "August 20, 2019"
output: pdf_document
---

```{r setup, include=FALSE}
library(dplyr)
library(plotly)

#
rptyear <- 2018
colours <- c("A" = "royalblue3", "B" = "red", "C" = "gold", "D" = "green4")

# data
premiumtable <- data.frame(Var1 = rep(c("A","B","C","D"),11),
                           Var2 = c(rep(2009,4),rep(2010,4),rep(2011,4),rep(2012,4),rep(2013,4),rep(2014,4),rep(2015, 4),rep(2016,4), rep(2017,4),rep(2018,4),rep(2019,4)),
                           Freq = as.numeric(c(13223284, 3379574,721217, 2272843,14946074,4274769, 753797,2655032, 15997384, 4952687, 722556,3035566,16244348,5541543,887109,3299966,15841630,6303443,1101696,3751892,14993295, 6993626,1312650,4158196,13946038, 7081457,1317428,4711389, 12800640, 6923012, 1345159, 4911780, 12314663, 6449919, 1395973,5004046,12612704,6968110,1507382,5745079,15311213,8958588,1849069,6819488)))

# prepare plot data
currentPrem <-   
  premiumtable %>% 
  filter(Var2 == rptyear, Freq != 0) %>% 
  mutate(Freq = as.numeric(Freq))

# create plot labels
labels = paste0(currentPrem$Var1, "\n $",prettyNum(round(as.numeric(currentPrem$Freq)/1000), big.mark = ","))

# create plot
piechart <- plot_ly(currentPrem,
        labels = ~labels,
        values = ~Freq, type = 'pie',
        textposition = 'outside',
        textinfo = 'label',
        colors = colours) %>%
  layout(title = paste("YTD Numbers:", rptyear),
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         showlegend = FALSE)

```

有人告诉我:“如果您希望输出为 PDF,您可以使用 export() 写入磁盘(png、pdf 等),然后使用 knitr::include_graphics() 或使用包 webshot。如果您需要更多详细信息,我会将此作为一个新问题提出。”

我想我更喜欢使用webshot。我不希望每次运行此报告时都保存 40 个 png 文件。 (我的报告在循环中)

没有错误消息,当我尝试打印或只是在块中输入“piechart”时它只是显示空白

我试过了:

export('piechart', 'piechart.png', 'png')
knitr::include_graphics("piechart.png")

我得到这个错误:

PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.

【问题讨论】:

  • 仅供参考,phantomjs 的发展是suspended,所以我想知道(没有具体原因)webshot 的使用将持续多久。为了解决您的“每次都没有保存 40 个 png 文件”,我建议查看 knitrcaching

标签: r pdf r-markdown plotly knitr


【解决方案1】:

您应该考虑尝试webshot2,而不是使用webshot。类似情况见my detailed answer

整个工作代码

---
  title: "Untitled"
author: "Morg"
date: "August 20, 2019"
output: pdf_document
---

  ```{r setup, include=FALSE}
library(dplyr)
library(plotly)

#
rptyear <- 2018
colours <- c("A" = "royalblue3", "B" = "red", "C" = "gold", "D" = "green4")

# data
premiumtable <- data.frame(Var1 = rep(c("A","B","C","D"),11),
                           Var2 = c(rep(2009,4),rep(2010,4),rep(2011,4),rep(2012,4),rep(2013,4),rep(2014,4),rep(2015, 4),rep(2016,4), rep(2017,4),rep(2018,4),rep(2019,4)),
                           Freq = as.numeric(c(13223284, 3379574,721217, 2272843,14946074,4274769, 753797,2655032, 15997384, 4952687, 722556,3035566,16244348,5541543,887109,3299966,15841630,6303443,1101696,3751892,14993295, 6993626,1312650,4158196,13946038, 7081457,1317428,4711389, 12800640, 6923012, 1345159, 4911780, 12314663, 6449919, 1395973,5004046,12612704,6968110,1507382,5745079,15311213,8958588,1849069,6819488)))

# prepare plot data
currentPrem <-   
  premiumtable %>% 
  filter(Var2 == rptyear, Freq != 0) %>% 
  mutate(Freq = as.numeric(Freq))

# create plot labels
labels = paste0(currentPrem$Var1, "\n $",prettyNum(round(as.numeric(currentPrem$Freq)/1000), big.mark = ","))

# create plot
piechart <- plot_ly(currentPrem,
                    labels = ~labels,
                    values = ~Freq, type = 'pie',
                    textposition = 'outside',
                    textinfo = 'label',
                    colors = colours) %>%
  layout(title = paste("YTD Numbers:", rptyear),
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         showlegend = FALSE)

htmlwidgets::saveWidget(widget = piechart, file = "hc.html")
webshot(url = "hc.html", file = "hc.png", delay = 1, zoom = 4, vheight = 500)

```

输出

【讨论】:

猜你喜欢
  • 2015-12-12
  • 1970-01-01
  • 2016-05-29
  • 2021-09-15
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多