第 8 章 htmlwidgets (I): plotly

8.1 HTML and Graphs

8.1.1 靜態圖形引入html

8.1.1.1 非向量圖形

  • 「非」向量格式:不是以幾何座標記載,而是整個圖面以raster矩陣去看待,且矩陣資料多有壓縮過。(.jpg, .png等)
<img src="圖檔來源">

8.1.1.2 SVG向量圖形

  • 向量格式: 圖形幾何以向量座標記載。(.svg,.shp等)
8.1.1.2.1 <svg>內部崁入

.svg檔也可以把圖檔內容之<svg>...</svg>區塊直接寫在html裡。

  • 見svg_sample.html

8.1.2 Rmd引入svg

有兩種做法:

8.1.2.1 knitr::include_graphics

但圖形會失去SVG資訊成為base64編碼的圖資:

8.1.2.2 <object>外部引入

在文字區採用<object>引入方式。

8.1.3 ggplot與svg

8.1.3.2 gridSVG::grid.export

使用gridSVG::grid.export存成的svg有較豐富結構(如每個html element都有id),可較輕易後製讓SVG有interaction:

8.2 網頁互動

透過html裡放入的javascript(js)來進行所要變化:

  • html頁面的每個元素都屬於一個<tag name> ...</tag name>區塊。

  • js可以選出所要區塊並進行所要更動。

  • js也可以監視使用者是不在所要區塊做了什麼動作(如:點滑鼠右鍵,滑滾輪等)

8.2.1 htmlwidget

htmlwidget是指具有與使用者互動的網頁UI設計,在R裡有不少套件可以幫我們把R output生成htmlwidget,如plotly, leaflet等。

8.2.2 widget生成流程

從R到htmlwidget流程

因此我們需要一個可以完成R圖形物件htmlwidgets的工具,這裡我們介紹兩個工具:

  • plotly::ggplotly() : 直接將設計好的ggplot物件轉成htmlwidgets(但可能有些設計會失效,要進一步微調)。

  • plotly::plotly(): 不使用ggplot繪圖,直接用plotly()畫,它會直接產生htmlwidgets。

8.2.3 htmlwidget的引用

有以下兩種:

  • 直接在RMarkdown生成,沒有額外引入步驟,但生成的視覺設計會受RMarkdown css的影響。

  • 另外存成html檔,在R Markdown裡以<iframe>方式引入。多些步驟,但少了設計相衝的問題。

8.3 Plotly.R

8.3.2 修改

8.3.2.1 Chart studio設定

  1. 先在此註冊:https://chart-studio.plot.ly

  2. 登入找到自己的plotly API key

  3. 在目前程式寫作的目錄創立一個檔名為.Rprofile的檔案:

  1. 裡面存以下兩行指令:
Sys.setenv("plotly_username"="各位的plotly平台使用者名稱")
Sys.setenv("plotly_api_key"="各位的API key的那一串英文與數字")
  1. 以後打開你的project,那兩行會自動執行。

執行以下兩行確認:

若沒有,執行:

參考資料:
* Getting Started with Plotly for R

8.3.2.2 本機編修

  • 直接修改list元素值。

8.3.2.3 上傳編修

  1. 使用api_create()上傳plotly物件到plotly online editor.
  1. 上傳成功進入plot.ly chart studio, 點選My Files,可以看到“pltly_hw5_004”。

  2. 點選圖形浮現的EDIT

編修可以:

  • 特性類別點選進入修改;或

  • 更改JSON(老師偏好這個)

選單大部份意思可以猜得出來,或查看Plot.ly chart studio tutorial

JSON:

8.3.3 使用

api_download_plot

編修前
編修後

8.3.3.1 修改ggplotly物件

先使用plotly_json()觀察plotly物件內容,再透過:

8.4 Hover

滑鼠滑過稱為Hover。前小節我們學到怎麼用ggplot做好底圖的視覺美感,接下來我們通常會修正Hover information的呈現內容及格式。

8.4.1 Hover info

想顯示的訊息:

  • Any combination of “x”, “y”, “z”, “text”, “name” joined with a “+” OR “all” or “none” or “skip”.

  • text: 其他額外想顯示的訊息。

步驟1:找涉及圖層

使用plotly_json()檢視是哪個圖層(trace)的Hover要設定:

  • data: 定義不同圖層的geom, 外觀,hoverinfo等。

  • layout: 整個圖面的設計。

  • config: 其他

8.4.2 Hover text

除了x,y座標也可以增加其他文字訊息:

plotly的hovertext是由每個trace的text mapping值來決定,我們可以在ggplot繪圖時對想有hovertext的圖層使用aes(text=...)來增加text mapping,雖然geom可能不支援text mapping,但會pass on。

另外,也可以在ggplotly()裡使用tooltip=c("text")來設定以text aes mapping為hoverinfo的text內容。ggplotly() 也可以用來設定圖形width, height。

8.4.2.1 Hover box

  • Hovertemplate: the information that appear on hover box. Note that this will override hoverinfo. Variables are inserted using %{variable}, for example “y: %{y}”. Numbers are formatted using d3-format’s syntax %{variable:d3-format}, for example “Price: %{y:$.2f}”. https://github.com/d3/d3-3.x-api-reference/blob/master/Formatting.md#d3_format for details on the formatting syntax.

8.5 Plotly to htmlwidget

Dashboard是數個htmlwidgets組成,這節我們學習怎麼把plotly圖形存成htmlwidget,及之後如何引入dashboard使用。

範例:

8.5.0.1 步驟1:存下htmlwidget

  • frameableWidget是用來確保htmlwidget在引入responsive designed html裡時,其responsive反應和主html檔一致。

8.6 Plotly.js

基礎的用法是:

  1. ggplot -> plotly::ggplotly() -> plotly R調整動態效果 -> 另存htmlwidget -(1)-> R Makrdown iframe embed -> html

    • 優點:快速產生基礎htmlwidget

    • 缺點:許多動態調整不容易掌握

  2. ggplot -> plotly::ggplotly() -> plotly_json() 取出JSON input -> 以html語法直接使用Plotly JS完成htmlwidget -(2)-> R Makrdown iframe embed -> html

    • 優點:動態調整較容易掌握

    • 缺點:產生基礎htmlwidget需要多些步驟

在iframe步驟前:

  • (1)使用save_frameableWidget()

  • (2)使用to_frameableHTML()

8.6.1 Logics

一張plotly htmlwidget包含有:

  • JSON (JavaScript Object Notation):
    定義trace, layout, config等

  • Plotly.newPlot():

    • 接收JSON圖面定義

    • 於指定<div>區塊完成:

      • SVG圖形繪製

      • event handler佈署

8.7 流程圖:htmlwidgets生成與引入

以下流程圖說明如何形成獨立html檔之plotly htmlwidget,以便於下一章融入flexdashboard使用。