plotly インタラクティブな図

pip install plotly
まずはplotlyをインストールする
import plotly
import plotly.graph_objects as go
plotly.offline.init_notebook_mode(connected=False)

2行目のplotly.offline.init_notebook_mode(connected=False)はmatplotlibの%matplotlib inlineと同様な役割である。

これを書いておくことでjupyter notebook内で画像をプロットできるようになる。

plotly.graph_objectsはmatplotlibのmatplotlib.pyplotに相当するものでこれを使ってプロットしていくことになる。

簡単のためgoとしてインポートしている。

import pandas as pd

birth_rate_df = pd.read_csv('birth_rate.csv', encoding="shift-jis") # csvファイル内の日本語を読み込むためencoding="shift-jis"をつける
birth_rate_df.head(5)
出生数総数出生率出生性比合計特殊出生率
0194726787921376986130180634.3105.84.54
1194826816241378564130306033.5105.84.40
2194926966381380008131663033.0104.84.32
3195023375071203111113439628.1106.13.65
4195121376891094641104304825.3104.93.26
data = [
    go.Bar(x=birth_rate_df["年"], y=birth_rate_df["男"], name="棒"),
    go.Scatter(x=birth_rate_df["年"], y=birth_rate_df["男"], name="折れ線", mode='lines')
]

fig = go.Figure(data=data)
fig.show()
  • dataを同時にプロットする図のリストとして保存する。
  • 棒グラフのプロットにはgo.Bar()(=plotly.graph_objs.Bar())を使う
    • 引数としてx=x軸データy=y軸データname=labelを受け取っている。
    • name=labelはmatplotlibでのlabel=と同じような引数で、凡例の名前(ラベル)を設定する。
  • matplotlibとは違って、plotlyではplotly.Scatter()で折れ線グラフと散布図を両方表示できる。
    • modeという引数で調節する。
    • mode='lines'では折れ線グラフ、mode='markers'では散布図グラフを表示する。
  • go.Figure()よりfigureを作り、引数dataに作っておいたdata(リスト)を与えている。
  • fig.show()より結果として表示している。
  • plotlyの最も重要な特徴としてはインタラクティブな図となっている点である。簡単なグラフの操作方法について以下で説明する。
    • ドラッグした部分を拡大できる。
    • 軸をドラッグすることでグラフを軸方向に移動させることができる。
    • ダブルクリックや右上のツールバーでのAutoscaleを押すことで初期状態に戻る。
    • ツールバーのカメラボタンを押すことでpng画像として保存できる。

まとめ

  • 棒グラフはgo.Bar()、折れ線グラフと散布図はplotly.Scatter()で作る。
  • plotly.Scatter()の引数modeで折れ線グラフか散布図かを決められる。
  • プロットしたい図をリストでまとめてgo.Figure()の引数dataに与える。
  • fig.show()より結果として表示している。

注意

  • matplotlibとは違ってplotly.Scatter()で折れ線グラフと散布図の両方を作ることを覚えておこう。

Layoutでカスタマイズ

plotlyを使って年別の"出生数総数"の棒グラフと"出生率"の折れ線グラフを同じ図の中に同時にプロットせよ。

そのとき、"出生数総数""出生率"の値にはスケールに大きな差があるので、"出生率"のy軸の値は別に表示せよ。

data = [
    go.Bar(x=birth_rate_df["年"], y=birth_rate_df["出生数総数"], name="出生数総数", yaxis='y1'),
    go.Scatter(x=birth_rate_df["年"], y=birth_rate_df["出生率"], name="出生率", yaxis="y2")
]

layout = go.Layout(
    title="日本の出生数総数と出生率",
    legend={"x":0.8, "y":0.1},→これで位置を指定できる。指定しないと枠外
    xaxis={"title":"年"},
    yaxis1={"title":"出生数総数"},
    yaxis2={"title":"出生率(%)","overlaying":"y1", "side":"right"},
)

fig = go.Figure(data=data, layout=layout)
fig.show()

解説

  • go.Figure()に追加されている引数layoutでグラフをカスタマイズしている。
  • dataの中のgo.Bar()go.Scatter()に引数yaxisが追加されている。
    • yaxis='y1'yaxis='y2'でそれぞれ異なるy軸を使用することを示している。'y1''y2''y3'、…のように与えればよい
  • layoutgo.Layout()で作られ、引数としてカスタマイズしたい部分を指定している。
    • titleでタイトルを指定できる。
    • legend={"x":0.8, "y":0.1}で凡例の位置を指定する。
      • 辞書型で{"x":0~1, "y::0~1}のように与える。xが1では一番右、yが1では一番上の方に凡例が表示される。
    • xaxisでx軸をカスタマイズする。
      • x軸は1つしかないので添字をつけていない。辞書型で{title:''}のように軸のタイトルを指定する。
    • yaxis1'y1'のy軸のカスタマイズする。
    • yaxis2'y2'のy軸をカスタマイズする。
      • 引数は辞書型に与えられ、その中のキーの意味を説明すると"overlaying":"y1""y1"グラフと重ねて表示することを意味し、 "side":"right"は軸を右側に表示するということを意味する。"side":"left"のようにするとy1軸と重ねて左側に表示される。
  • fig = go.Figure(data=data, layout=layout)よりfigureにデータとレイアウトを反映できる。

まとめ

  • layoutを作ることでカスタマイズをまとめてできる。
  • layoutでタイトル、軸名、凡例の位置などを設定できる、
  • dataを作るとき、yaxisを指定し、layoutでグラフごとのy軸をカスタマイズできる。

注意

  • 2つ目のy軸をカスタマイズするとき"overlaying":"y1"でy1グラフと重ねるようにしないと、y2だけが表示されてしまう。

コメント

タイトルとURLをコピーしました