Pythonで図やグラフを描くときにPlotlyを使ったことはありますか?
matplotlibが有名なので使っている人が多い印象ですが、Plotlyの方がグラフを動かしたり拡大したりとインタラクティブなので便利です。
そこで、今回はPlotly初心者向けにどういったライブラリなのかの解説をしていこうと思います。
また、少し使ったことがある方ならplotly.graph_objects
やplotly.express
をインポートして使ったことがあると思います。
今回はこれらの違いについても解説してきます。
英語ですが公式サイトは以下に紹介しておきます。
Plotlyとは?
PlotlyとはPythonやRでインタラクティブなグラフを作るためのライブリーのことです。
オープンソースなのでコチラ(GitHub)で公開しています。
散布図・折れ線グラフ・棒グラフ・円グラフ・ヒストグラム・ヒートマップなど基本的なグラフはもちろんのこと、3Dグラフやアニメーションなんかも作れるのが魅力ですね。
Plotlyでできること
- グラフを動かせる
- 拡大、移動できる
- 画像で保存できる
- HTML化できる
これが「インタラクティブ」ということですね。ここがmatplotlibと異なる点ではないでしょうか?
Plotlyを使うための準備
pipかcondaでインストールします。
1 2 3 4 5 |
#pip pip install plotly==4.14.3 #conda conda install -c plotly plotly |
インストールが完了したらライブラリのインポートです。
1 2 3 |
import plotly.graph_objects as go import plotly.express as px |
ここでgoとpxの2つをインポートしていますが、これが今回の本題です。
これらの違いを解説していきたいと思います。
それぞれ「as px
」と「as go
」と表されることが多いです。このようにするとコードが短くて済みますね。
goとexpressの違い
ここでは、goとpxにどのような特徴があるのかを書いています。
より詳しい用語の解説や、コードの違いは以下にまとめています。
Pythonでグラフを描くときに便利なplotlyですが、初心者にとっては難しいかもしれないですね。 私も初めて使ったときは何が何だかサッパリでしたが、理解できるとサクサクグラフを描くことができます。 今回は初心者向けにplo[…]
low-levelは開発者向けの細かい設定ができるもので、high-levelとは初心者向けのコードが書きやすいものと言う認識でOKです。
公式サイトでそれぞれのコードの行数の違いを比較しているものがありました。
同じグラフを出力するためのコードですが、明らかに行数が異なりますね。(笑)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#データフレームの作成 import pandas as pd df = pd.DataFrame({ "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"], "Contestant": ["Alex", "Alex", "Alex", "Jordan", "Jordan", "Jordan"], "Number Eaten": [2, 1, 3, 1, 3, 2], }) #expressの場合 import plotly.express as px fig = px.bar(df, x="Fruit", y="Number Eaten", color="Contestant", barmode="group") fig.show() #graph_objectsの場合 import plotly.graph_objects as go fig = go.Figure() for contestant, group in df.groupby("Contestant"): fig.add_trace(go.Bar(x=group["Fruit"], y=group["Number Eaten"], name=contestant, hovertemplate="Contestant=%s<br>Fruit=%%{x}<br>Number Eaten=%%{y}<extra></extra>"% contestant)) fig.update_layout(legend_title_text = "Contestant") fig.update_xaxes(title_text="Fruit") fig.update_yaxes(title_text="Number Eaten") fig.show() |
pxは1行だけで書かれていますが、goの方は7行も書かれています。両方とも同じデータフレームを渡していますが、その扱い方が異なるのでコードの量に差が出てきてしまします。
データ分析ではPythonのpandasが有名ですよね。とくに大量のデータを処理できるデータフレーム(DataFrame)は使いこなせると便利です。 そこで今回は、データフレームの作成方法を紹介していきたいと思います。 [it[…]
また、goの方は「update_xaxes
」や「update_yaxes
」のように軸名を指定しないと表示されないことも、コードが増えてしまう原因といえます。
なら、goを使うとコードが長くなるならpxだけでいいのかというとそうでもありません。両方に長所と短所があります。
plotly.graph_object(go)の特徴
- 3Dグラフの種類が多い
- 複数のグラフ(グラフのマトリックス)を描ける
3Dグラフの種類が多い
pxでも3Dグラフを描くことはできますが、goの方が描けるグラフの種類は多いです。
そのうちpxでも描けるようになるかもしれませんが、まだ無理なようですね。
複数のグラフを描ける
Plotlyで複数のグラフをマトリックス形式で表示することを「サブプロット」と言います。
下の画像のように複数のグラフを一度に表示できます。
正確には「from plotly.subplots import make_subplots
」とgoを組み合わせて使うことで、上のような複数のグラフを描くことができます。
特に、種類の異なるグラフを複数並べたいときに使います。
画像で保存したいときも複数枚を
一度に収めることができるのでラクですね。
より詳しいサブプロットに関する内容は別記事にしたいと思います。
plotly.express(px)の特徴
- データフレームからのグラフの作成がラク
- ファセットプロットが簡単にできる
データフレームからのグラフの作成がラク
上の例でも見たように、データフレームをもとにグラフを描くならpxの方がラクですね。
コードの量が少なくて済みますし、その方が見返したときや他人が見たときに理解しやすいです。
ファセットプロットが簡単にできる
ファセットプロットとは複数のグラフを同じ軸で表示したものです。トレリスプロットやスモールマルチプルとも呼ばれています。
見た目はgoで出てきたサブプロットに似ていますが、pxの場合はすべて同じ種類のグラフになります。
散布図とヒストグラムと3Dグラフを同時に表示することはできません。
1つのデータフレームのある列をグループごとに表示するというイメージですね。
Dashとは?
DashとはWebアプリケーションを作るためのフレームワークです。公式サイトでは以下のように書かれています。
Dash is a productive Python framework for building web analytic applications.
Dashは、Web分析アプリケーションを構築するための生産性の高いPythonフレームワークです。
https://dash.plotly.com/introduction
Plotlyを初めて使うのであれば、FlaskやDjanogと同じフレームワークの仲間であるという認識でOKです。
Webフレームワークの中でもグラフの表示に特化したものがDashということです。
先に紹介しているpxやgoを使うだけなら気にしなくてOKです。
まとめ
いかがでしたか?
今回は初心者向けにPlotlyで使うモジュールの違いについてまとめてみました。
私も最初のころはpxとgoの違いがわからずに使っていました。そのせいで、調べるのに時間がかかったり、そもそもできないことをしようとしていたりとロスがありました。(笑)
時間が無駄にならないように、これからPlotlyデビューする方の参考になれば幸いです。
Pythonでグラフを描くときに便利なplotlyですが、初心者にとっては難しいかもしれないですね。 私も初めて使ったときは何が何だかサッパリでしたが、理解できるとサクサクグラフを描くことができます。 今回は初心者向けにplo[…]