ホーム > 記事 > Python > Plotly > 【Plotly】棒グラフを描く | 折れ線グラフを描く | データを見える化する

記事

【Plotly】棒グラフを描く | 折れ線グラフを描く | データを見える化する

pythonでデータを加工したけどグラフの描き方が分からない。データを見える化したいけど、どうしたら良いかわからない。そんな人のための入門向けの記事です。

目次

  1. インストール
  2. 動作確認
  3. カスタマイズ
  4. まとめ

01. インストール

まずはインストールしましょう。Pythonは3.9以降を想定しています。pipでplotlyをインストールします。

pip install plotly

インストールが終わったら早速動作を確認してゆきます。

↑目次

02. 動作確認

空ファイルを作って編集します。

touch RankingPlot.py

Plotlyのホームページにもあるサンプルが動くことを試しておきたいのでRankingPlot.pyをサンプルと同じように記述します。

# -*- coding: utf-8 -*-

import plotly.graph_objects as go
fig = go.Figure(data=go.Bar(y=[2, 3, 1]))
fig.write_html('first_figure.html', auto_open=True)

記述を終えたら早速実行してみます。

py RankingPlot.py

実行したフォルダ中にfirst_figure.htmlというファイルが作成され、ブラウザが起動し棒グラフが表示されます。
Plotlyの動作確認

実際に動作することがわかったのでカスタマイズしてゆきます。

↑目次

03. カスタマイズ

03.1 折れ線グラフへの変更

棒グラフ(bar)から折れ線グラフに変更します。Line Chartsのサンプルがあっためこれを元に修正します。

# -*- coding: utf-8 -*-

import plotly.express as px

df = px.data.gapminder().query("continent=='Oceania'")
fig = px.line(df, x="year", y="lifeExp", color='country')
fig.show()

いきなり最初のimport文から違っています。戸惑いましたが、まずは実際に動作するか試してみます。

$ py RankingPlot.py
Traceback (most recent call last):
  File "C:\Users\d-uehara\OneDrive\01.開発\21_PythonAI\RankingChecker\RankingPlot.py", line 3, in 
    import plotly.express as px
  File "C:\Users\d-uehara\AppData\Local\Programs\Python\Python39\lib\site-packages\plotly\express\__init__.py", line 10, in 
    raise ImportError(
ImportError: Plotly express requires pandas to be installed.

エラーが発生しました。pandasというライブラリが必要なようです。pipでインストールします。

pip install pandas

再度実行します。

py RankingPlot.py

Plotlyを用いた線グラフの描画

無事に折れ線グラフが表示されました。
今度はローカルファイルが作成されてブラウザが開くのではなくローカルでサーバが起動してそちらのポートに接続しているようです。
plotly.expressを使う場合と、plotly.graph_objectsの使い分けがよくわからないので以下のページで調べてみました。

Graph Objects in Python

調査の結果、以下のことがわかりました。

  • 推奨はplotly.expressを使う方法
  • plotly.expressはplotly.graph_objectsのインスタンスを返す
  • plotly.expressで対応していない場合、たとえばメッシュや特定の3Dトレースを利用する場合にplotly.graph_objectsを利用する

今回はサイトの順位変動をグラフにするので単純な折れ線グラフを用います。 そのためplotly.expressを使うことにします。 さらに上記サイトのサンプルをみるとプロットデータの定義の仕方が載っていました。これを参考にソースコードをいじってみます。

# -*- coding: utf-8 -*-

import pandas as pd
import plotly.express as px

df = pd.DataFrame({
    "Days" : ["2021-05-01","2021-05-02","2021-05-03","2021-05-01","2021-05-02","2021-05-03","2021-05-01","2021-05-02","2021-05-03"],
    "WebSite" : ["Site A","Site A","Site A","Site B","Site B","Site B","Site C","Site C","Site C"],
    "Ranking" : ["1","1","2","2","3","3","3","2","1"]
})
fig = px.line(df, x="Days", y="Ranking", color='WebSite')
fig.show()

上記を記載中、VSCodeがpandaのインポートで以下のエラーを出していました。

import "pandas" could not be resolved from source Pylance(reportMissingModuleSource)

これは開発環境の問題でVSCodeのsetting.jsonの"python.autoComplete.extraPath"にpythonのsite-packagesのフルパスを指定するとエラーがでなくなりました。エラーがでなくなったところで早速コードを実行します。

py RankingPlot.py

Plotlyを用いた順位のプロット

離散データを結んでプロットできました。

03.2 軸の変更

このデータはランキング(順位)なのでy軸の上下を反転させます。調査の結果`fig['layout']['yaxis']['autorange']`の値を'reversed'に変えればよさそうです。

また`fig['layout']['xaxis']['tickformat']`で日付フォーマットを指定できそうです。

両方とも直接値を編集するのではなくfig.update_XXというメソッドがあるのでそれを使います。ラベルも英語から日本語に変更してみます。

# -*- coding: utf-8 -*-

import pandas as pd
import plotly.express as px

df = pd.DataFrame({
    "日付" : ["2021-05-01","2021-05-02","2021-05-03","2021-05-01","2021-05-02","2021-05-03","2021-05-01","2021-05-02","2021-05-03"],
    "サイト" : ["Site A","Site A","Site A","Site B","Site B","Site B","Site C","Site C","Site C"],
    "順位" : ["1","1","2","2","3","3","3","2","1"]
})
fig = px.line(df, x="日付", y="順位", color='サイト')
fig.update_yaxes(autorange='reversed')
fig.update_xaxes(tickformat="%Y-%m-%d")
fig.show()

終わったら実行します。
PlotlyにおけるY軸の反転方法

うまくゆきました。今回はここまでとします。

↑目次

04. まとめ

PlotlyはFigureWidgit(ソースコードのfigの部分)のデータ構造さえわかれば、かなり自由にグラフを作成できるということがわかりました。

次回は以前作成したSQLiteに接続してDB上のデータを可視化します。

↑目次

この記事へのコメント

コメントはまだありません。

コメントを送る

必須
必須  
※ メールアドレスは公開されません
任意
必須
Loading...  画像の文字を入力してください