My Memo

私のメモ

Plotlyで線グラフをたくさん描く

Plotlyとは?

Pythonのグラフ描画ライブラリーで描画したグラフの拡大縮小,軸のスケールの変更などなどができる.
Plotlyのグラフ描画モジュールにはexpressとgraph_objectsがあるらしいが,基本はgraph_objectsでexpressモジュールはサクッとグラフを書くためのモジュールで内部ではgraph_objectsの関数を呼んでいるらしい.(公式ドキュメントPlotly Express | Python | Plotlyの雑和訳)

f:id:Ibetoge:20210427124756g:plain
Plotlyの動くグラフ

今回はgraph_objectsでいい感じのグラフを色々書いてみる

expressでの描写はこちら→
ibetoge.hatenablog.com

線グラフ

基本的なグラフを描写してみる.とりあえず使うモジュールをインポートする.

import numpy as np
import plotly.graph_objects as go

ひとまず0\le t\le2\pi\sin{4t},e^tを描く.

# データを用意
t = np.linspace(0, 2*np.pi, 10)
sint = np.sin(4*t)
ex = np.exp(t/np.pi)

# グラフのインスタンス作成
fig = go.Figure(data=[
    go.Scatter(x=t, y=sint, name=r'$\sin t$'),
    go.Scatter(x=t, y=ex, name=r'$e^t$')
])

# 動かせるグラフをブラウザーで表示
fig.show()

基本的にはこれでグラフが描ける.

f:id:Ibetoge:20210427170338p:plain
基本的な線グラフ

あとは,軸に名前をつけるのと,作成したグラフのインスタンスに新しいグラフを追加してみたい.

# グラフ追加
fig.add_trace(go.Scatter(x=t, y=t**2/4, name=r'$t^2/4$', mode='markers'))  # ドットのみ
fig.add_trace(go.Scatter(x=t, y=sint*ex, name=r'$e^t\sin t$', mode='lines'))  # 線のみ
fig.add_trace(go.Scatter(x=t, y=1/t, name=r'$1/t$', mode='lines+markers'))  # ドットと線

# 軸の名前を追加
fig.update_xaxes(title="t")
fig.update_yaxes(title=r"$f(t)$")

こんな感じで追加できる.このとき,modeで線グラフの種類を選べる.modeを指定しないとPlotlyがいい感じに決めてくれる.グラフを追加できるので,まず空のインスタンスを作ってから追加していってもOK.つまり,

# 空のインスタンス作成
fig = go.Figure()

# グラフ追加
fig.add_trace(go.Scatter(x=t, y=t**2/4, name=r'$t^2/4$')) 
fig.add_trace(go.Scatter(x=t, y=sint*ex, name=r'$e^t\sin t$'))
fig.add_trace(go.Scatter(x=t, y=1/t, name=r'$1/t$' )) 

fig.show()

みたいな感じで書いてもいい.

f:id:Ibetoge:20210427171237p:plain
いろいろな線グラフ
f:id:Ibetoge:20210427171830p:plain
いろいろな線グラフ(横軸のメッシュ細かめ)

Plotlyのグラフをファイルに保存する

fig.show()

を用いると,実行した際に動かせるグラフがブラウザーに表示されるが,グラフをhtmlファイルとして保存したい場合は,

#htmlで保存
fig.write_html("figure.html")

でOK.画像ファイルとして保存するには,kaleidoパッケージが必要なので,次のどちらかのコマンドを叩いてkaleidoをインストールする.(kaleidoの代わりにorcaパッケージでも良いらしいが非推奨)
pipの場合

 pip install -U kaleido

anacondaの場合

 conda install -c conda-forge python-kaleido

kaleidoをインストールしたら,

#pngで保存
fig.write_image("figure.png")
#jpegで保存
fig.write_image("figure.jpeg")

と書けばすれば良し.こうすれば保存したhtmlファイルをブラウザで開けばいつでも動かせるグラフが見られる.もちろん画像ファイルとして保存した場合は動かせない.

棒グラフとは円グラフとかも書こうと思ったけど疲れたからここまで

ソースコード

いろいろな線グラフ

import numpy as np
import plotly.graph_objects as go

# データを用意
t = np.linspace(0, 2*np.pi, 100)
sint = np.sin(4*t)
ex = np.exp(t/np.pi)

# グラフの空インスタンス作成
fig = go.Figure()

# グラフ追加
fig.add_trace(go.Scatter(
    x=t, y=t**2/4, name=r'$t^2/4$', mode='markers'))  # ドットのみ
fig.add_trace(go.Scatter(x=t, y=sint*ex,
                         name=r'$e^t\sin t$', mode='lines'))  # 線のみ
fig.add_trace(go.Scatter(x=t, y=1/t, name=r'$1/t$',
                         mode='lines+markers'))  # ドットと線
# 軸の名前を追加
fig.update_xaxes(title="t")
fig.update_yaxes(title=r"$f(t)$")

# 動かせるグラフをブラウザーで表示
fig.show()
#htmlで保存
fig.write_html("figure.html")
#pngで保存
fig.write_image("figure.png")