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)
年 | 出生数総数 | 男 | 女 | 出生率 | 出生性比 | 合計特殊出生率 | |
---|---|---|---|---|---|---|---|
0 | 1947 | 2678792 | 1376986 | 1301806 | 34.3 | 105.8 | 4.54 |
1 | 1948 | 2681624 | 1378564 | 1303060 | 33.5 | 105.8 | 4.40 |
2 | 1949 | 2696638 | 1380008 | 1316630 | 33.0 | 104.8 | 4.32 |
3 | 1950 | 2337507 | 1203111 | 1134396 | 28.1 | 106.1 | 3.65 |
4 | 1951 | 2137689 | 1094641 | 1043048 | 25.3 | 104.9 | 3.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'
、…のように与えればよい
layout
はgo.Layout()
で作られ、引数としてカスタマイズしたい部分を指定している。title
でタイトルを指定できる。legend={"x":0.8, "y":0.1}
で凡例の位置を指定する。- 辞書型で
{"x":0~1, "y::0~1}
のように与える。xが1では一番右、yが1では一番上の方に凡例が表示される。
- 辞書型で
xaxis
でx軸をカスタマイズする。- x軸は1つしかないので添字をつけていない。辞書型で
{title:''}
のように軸のタイトルを指定する。
- x軸は1つしかないので添字をつけていない。辞書型で
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だけが表示されてしまう。
コメント