plotlyライブラリのロード
::p_load(plotly) pacman
Rでインタラクティブなグラフを作成したい場合には、rglパッケージ(Murdoch and Adler 2023)や、Javascriptのインタラクティブグラフィックライブラリであるd3.jsを使用したライブラリであるr2d3 (Strayer, Luraschi, and Allaire 2022)を用いるなど、様々な方法があります。
このようなインタラクティブなグラフ作成パッケージの中では、plotly (Sievert 2020)が機能が多彩かつ記述の方法もシンプルで非常に分かりやすい優れたライブラリです。
plotlyライブラリのロード
::p_load(plotly) pacman
以前はRでインタラクティブなグラフを作成しても、Rが実行されているPC上でのみ確認ができただけで、他の人とグラフを共有するすべがほとんどありませんでした。しかし、ここ10年で、Rを用いてHTMLの文書を作成するライブラリ(RMarkdown (Allaire et al. 2023; Xie, Allaire, and Grolemund 2018; Xie, Dervieux, and Riederer 2020)、Quarto)や、Webアプリケーションを作成するためのライブラリ(Shiny)(Chang et al. 2024)が公開され、インタラクティブなグラフを共有するしくみが構築されました。
Web上でのインタラクティブなグラフの多くはd3.jsで構築されていると思います。しかし、d3.jsの記法はやや特殊で、Rユーザーが使いこなすのはやや難しいです。plotly
は主にPythonのライブラリとして開発されていますが、Rやほかの言語での開発も行われています。記法もggplot2
やRのデフォルトのグラフィック関数に近く、Rユーザーにも使いやすいものとなっています。
インタラクティブなグラフの使いどころは難しいですが、有効に用いれば、データを確認しやすく、見る人の興味を引くグラフを作成することができます。
plotly
では、グラフはplot_ly
関数で描画します。plot_ly
関数の引数としてグラフのタイプ(type
)を指定しない場合には、x
やy
軸に指定した値に対応したグラフを描画してくれます。x
にもy
にも数値を指定すれば、散布図が自動的に選択されて、描画されます。x
やy
などの、ggplot2
でのaes
にあたる要素の指定では、データフレームの列名にチルダ(~
)を付けます。チルダがないと、列名をうまく読み込むことはできません。
plot_ly関数で散布図
plot_ly(data = iris, x = ~Sepal.Length, y = ~Sepal.Width, color = ~Species)
ggplot2
と同様に、color
やsize
などの引数に数値を取ることで、バブルチャートなどのグラフを作成することもできます。
plot_ly関数でバブルチャート
|>
iris plot_ly(x = ~Sepal.Length, y = ~Sepal.Width, color = ~Petal.Length, size = ~Petal.Width)
ggplot2
でのscale_color_brewer
のように、Color Brewerを用いた色の指定も行うことができます。配色の指定にはcolors
という引数を用います。
ColorBrewerの色指定
sample(1:nrow(diamonds), 500),] |>
diamonds[plot_ly(data = _, x = ~carat, y = ~price, color = ~carat, colors = "RdYlGn")
x
に因子、y
に数値を与えると、plot_ly
関数は自動的に棒グラフを描画します。逆にx
に数値、y
に因子を与えると、棒グラフが横向きになります。
棒グラフの描画
|>
iris group_by(Species) |>
summarise(mSepal.Length = mean(Sepal.Length)) |>
plot_ly(x = ~Species, y = ~mSepal.Length, color = ~Species)
線グラフを描画する場合のx
、y
の指定は散布図と同じです。線を加える場合には、mode="lines"
もしくはmode="lines+markers"
と指定します。"lines"
で指定した場合には線のみ、"lines+markers"
は点と線を描画する形になります。
mode="lines"で線グラフを描画
::p_load(gapminder)
pacman<- c("red", "blue", "green", "black") # 色をベクターで指定
color_4
::gapminder |>
gapminderfilter(country == "Japan" | country == "China" | country == "United States" | country == "Australia") |>
plot_ly(x = ~year, y = ~gdpPercap, type = "scatter", mode = "lines+markers", color = ~country, colors = color_4)
3次元のグラフはrgl
で描画できますが、plotly
でも簡単に3次元グラフを作成することができます。plotly
で三次元グラフを作成する場合には、x
、y
に加えて、z
軸に相当する値を指定します。ただし、rgl
と同じように、3次元グラフはデータを認識しにくいため、3dグラフを用いるのではなく他のグラフ、例えばバブルチャートなどを選択する方がよいでしょう。
plotlyで3次元グラフ
|>
iris plot_ly(x = ~Sepal.Length, y = ~Sepal.Width, z = ~Petal.Length, color = ~Species, size = 0.1)
x
軸に日時データを指定すれば、簡単に時系列グラフを描画することができます。時系列プロットや線グラフを作成する場合には、plot_ly
関数の返り値をadd_trace
関数の引数にする形でも指定できます。
add_trace関数
data.frame(year = time(Nile), value = Nile) |>
plot_ly(type = "scatter", mode = "lines") |>
add_trace(x = ~year, y = ~value)
企業の財務状態などを表記する場合には、ウォーターフォールプロットが便利です。ウォーターフォールプロットでは、収益と支出の色を変え、収益はプラス方向、支出はマイナス方向の方向性を持った形で棒グラフで表現します。ウォーターフォールプロットを作図する場合には、type="waterfall"
と指定します。
plotly
では、ウォーターフォールプロットのほかにも、ろうそくチャートやオープン-ハイ-ロー-クローズチャートなど、ビジネスや株価に関連したグラフを簡単に作成することができます。
waterfallプロット
= c("Sales", "Consulting", "Net revenue", "Purchases", "Other expenses", "Profit before tax")
x= c("relative", "relative", "total", "relative", "relative", "total")
measure= c("+60", "+80", "", "-40", "-20", "Total")
text= c(60, 80, 0, -40, -20, 0)
y
= data.frame(x = factor(x, levels = x), measure, text, y)
data
<- plot_ly(
fig name = "20", type = "waterfall", measure = ~measure,
data, x = ~x, textposition = "outside", y= ~y, text = ~text,
connector = list(line = list(color = "rgb(63, 63, 63)")))
<- fig %>%
fig layout(title = "Profit and loss statement 2018",
xaxis = list(title = ""),
yaxis = list(title = ""),
autosize = TRUE,
showlegend = TRUE)
fig
plotly
では、ggplot2
で準備したグラフをインタラクティブなグラフに簡単に変換することができます。ggplot2
のグラフオブジェクトを変数に保存し、その変数をggplotly
関数の引数にするだけで、ggplot2
のグラフがインタラクティブなものに変換されます。
ggplotlyでインタラクティブなggplot2グラフ
<- iris |>
p ggplot(aes(x = Sepal.Length, y = Sepal.Width, size = Petal.Length, color = Species))+
geom_point()
ggplotly(p)