4

HTML ウィジェット (主に plotly と networkD3) の豊富さと、それらを R のグリッド内のプロットとして配置する可能性を組み合わせて、出版物の pdf グラフィックとしてエクスポートしたいと考えています。ただし、R でいくつかの html ウィジェット オブジェクトを作成し、それらをgridExtra::grid.arrange()で配置しようとすると(以下の最小限の例を参照)、次のエラーが発生します。

Error in gList(list(x = list(links = list(source = c(0, 0), target = c(1,  : 
only 'grobs' allowed in "gList"

「HTMLウィジェットをグロブまたはプロットに変換する」を検索してグリッドに配置できるようにしましたが、関連する情報は見つかりませんでした。最初にhtmlwidgets::saveWidget()を使用して html ウィジェットを Web サイトとして保存し、次に webshot:: webshot ()を使用してそれを PDF に変換し、ベクター グラフィック エディター (インクスケープ)。ただし、手動での作業にもかかわらず、すべての変換ステップで品質が低下する可能性があります。

おそらく、LaTeX R-Markdown ドキュメントのグラフィックスを表または列で配置し、プロットに合うように用紙の寸法を指定することができます。しかし、どういうわけか、それは理想的な解決策とは思えません。グラフをいくつかの列と行に動的に配置したり、タイトルを追加したりすると、LaTeX/knitr での配置が非常に複雑になります。

すべてを手作業で編む旅に出る前に、いくつかの html ウィジェット プロットを配置して R 内でそれらを pdf にエクスポートするためのより良い方法を知っているかどうかを尋ねたいと思います。


最小限の例

これは、私の問題を再現するための最小限の例です。私の目的は、2 つの異なるプロセスのエネルギー フローを相互に比較するグラフ (networkD3 を使用したサンキー ダイアグラム) であるとしましょう

これは私のコードです:

library(networkD3)
library(grid)
library(gridExtra)

## Create simplified Data
dfSankey <- list()
dfSankey$nodes <- data.frame(Name = c("Final Energy","Conversion Losses","Useful Energy"))
#1st process
dfSankey$links1 <- data.frame(Source = c(0,0),Target=c(1,2),Value=c(30,70))
#2nd process
dfSankey$links2 <- data.frame(Source = c(0,0),Target=c(1,2),Value=c(10,60))

## Draw Sankeys
plSankey1 <- sankeyNetwork(Links = dfSankey$links1, Nodes = dfSankey$nodes, Source = 'Source',
                          Target = 'Target', Value = 'Value', NodeID = 'Name')
plSankey2 <- sankeyNetwork(Links = dfSankey$links2, Nodes = dfSankey$nodes, Source = 'Source',
                           Target = 'Target', Value = 'Value', NodeID = 'Name')

#Arrange them next to each other
grid.arrange(plSankey1,plSankey2)

これにより、冒頭で説明したエラー メッセージが表示されます。


Windows 7、R-Studio 0.99.903、R バージョン 3.2.3、グリッド 3.2.3、gridExtra 2.2.1、networkD3 0.2.13

4

1 に答える 1

1

Amit Kohli のインスピレーションを受けて、flexdashboard、あらゆる種類の Rmarkdown 形式 (html、pdf、isolides など)、Rpresentation の実験を始めましたが、それらのすべてには、私の目標と比較していくつかの欠点がありました。

私の意見では、最高の視覚的結果は光沢のあるアプリで達成できます. 次に、結果の Web サイトをchromeで pdf として保存し、最後に briss で pdf をトリミングします。

library(networkD3)

## Create simplified Data
dfSankey <- list()
dfSankey$nodes <- data.frame(Name = c("Final Energy","Conversion Losses","Useful Energy"))
#1st process
dfSankey$links1 <- data.frame(Source = c(0,0),Target=c(1,2),Value=c(30,70))
#2nd process
dfSankey$links2 <- data.frame(Source = c(0,0),Target=c(1,2),Value=c(10,60))

# Define UI for application that draws two Sankeys in columns
ui <- shinyUI(fluidPage(column(6,
                               h2("Process 1", align = "center"),
                               uiOutput("plot1.ui")
                               ),
                        column(6,
                               h2("Process 2", align = "center"),
                               uiOutput("plot2.ui")
                               )
))

# Define server logic required to draw the sankeys
server <- shinyServer(function(input, output) {

    #Render plot area relative to flow height
    output$plot1.ui <- renderUI({
      sankeyNetworkOutput("Plot1", height = "400px")
    })
    output$plot2.ui <- renderUI({
      sankeyNetworkOutput("Plot2", height=paste0(400*(70/100),"px"))
    })

    #Render Sankeys
   output$Plot1 <- renderSankeyNetwork({
     sankeyNetwork(Links = dfSankey$links1, Nodes = dfSankey$nodes, Source = 'Source',
                   Target = 'Target', Value = 'Value', NodeID = 'Name', fontSize = 15, nodeWidth = 10)
   })

   output$Plot2 <- renderSankeyNetwork({
     sankeyNetwork(Links = dfSankey$links2, Nodes = dfSankey$nodes, Source = 'Source',
                   Target = 'Target', Value = 'Value', NodeID = 'Name', fontSize = 15, nodeWidth = 10)
   })
})

# Run the application 
shinyApp(ui = ui, server = server)

光沢のあるアプリを作成し、PDF に 2 つの html ウィジェット図を配置するためだけにこの手動変換をすべて行うのは、まだやり過ぎのように感じますが、少なくとも、結果として得られる pdf 画像は非常に満足のいくものに見えます。

これが他の人にも役立つことを願っています。

于 2016-10-19T11:09:51.323 に答える