gnuplotはもう嫌だ!pythonでグラフを書きたい!
以前こんな感じにRaspberry Piでセンサのデータを取得して可視化していました。
グラフ描くとき、昔ながらのgnuplotを使ったのですが、こんなコメントが。
Raspberry Pi + BME280モジュールで自動で温度・湿度・気圧を測定してグラフ化する - karaage. [からあげ]せっかくなのでグラフにしよう、と思って調べて最初にみつかったのがgnuplotだった。お、おぅ。(昔はgnuplotかなり使い込んでた)
2017/02/17 19:10
ぐ、ぐぬぬ(gnuplotだけに)。やはり今どきはgnuplotはスマートじゃないのだろうか。どうせならpythonで完結したいよねということで、pythonでグラフを描く方法を調べてグラフを描いて見ました。
色々調べた結果、以下のような、いかにも「gnuplotで描きました!」というようなグラフが
以下のようなスタイリッシュでオシャレンティ(死語)なグラフだったり
以下のようなユニークな漫画チックなグラフを描くことができるようになりました
この後は、宇宙語が続きますので「私もおしゃれなグラフ描きたいワン!」というワンちゃんは、尻尾振りながら続きを見ると良いです。
pythonとpandasとmatplotlibでcsvを読み込んでグラフ化する方法
MacとRaspberry Piでのセットアップに関して記載します。Windowsでも頑張ればできるんじゃないかな(適当)。自分の環境は以下の通りですが、他の機種やバージョンでも基本的には問題無いと思います。参考まで。
- Mac Book Pro Retina, Mid 2012(OS X Yosemite 10.10.5)
- Raspberry Pi 3(Raspbian Jessie with PIXEL 2016-11-25)
必要なライブラリはpython
、pandas
、matplotlib
、seaborn
になります。seaborn
ライブラリはグラフのスタイルに拘りがなければ必須ではありません。pythonのバージョンは今回はpython3を使用します。
Macの設定方法
Macの場合は、anaconda3を使うと、最初から必要なライブラリが入っていて簡単なのでanaconda3を使います。私は、pyenvを使って環境構築をしています。以下記事参照下さい。
Homebrewがインストールされている前提ですと、以下コマンドで打てば環境設定できます。ただ、今後のために上記記事で何をやっているか理解してから実施することをお勧めします。
$ brew install pyenv $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc $ brew install pyenv-virtualenv $ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc $ echo export PYENV_VIRTUALENV_DISABLE_PROMPT=1 >> ~/.bashrc $ pyenv install anaconda3-2.5.0 $ pyenv global anaconda3-2.5.0
以下でmatplotlibをインストールします。
$ pip install matplotlib
そのままだとエラーが出るので、以下のコマンドでmatplotlibrc
ファイルを作成(もしくは編集します)。
$ vim ~/.matplotlib/matplotlibrc
中身は以下とします
backend : TkAgg
これでOKです。
Raspberry Piの設定方法
以下記事を参考に「基本的なセットアップは完了です」と書いてあるところまで一通りセットアップ実施下さい。
あとは、ターミナルで以下のコマンドを実行すればOKです。
$ sudo apt-get update $ sudo apt-get install python3-pip $ sudo apt-get install python3-pandas $ sudo apt-get install python3-matplotlib
ちなみにRaspberry Piと書いていますが、他のLinuxでも上記コマンドで基本的にOKだと思います。一応適当なPC(Ubuntu14.04/16.04)を確認したらちゃんと動きました。
基本的なグラフの描き方
今回は例として、時間(time)、温度(temperature)、湿度(humidity)、気圧(pressure)の時系列が保存されたcsvファイル(sample.csv
)を使用します。ファイルの中身は以下のようになっていると思って下さい。
time, temperature, humidity, pressure 2016/05/22 02:10:01,21.0867422231,59.391544507,1017.48927819 2016/05/22 02:20:01,20.7770546449,60.0785619066,1017.44822635 2016/05/22 02:30:01,20.4978290685,60.6284558134,1017.25965455 2016/05/22 02:40:02,20.2490652056,61.1763110852,1017.4253724 2016/05/22 02:50:01,20.1119915389,61.3297823744,1017.40452414 2016/05/22 03:00:01,20.0053788337,61.4981035599,1017.57084668 2016/05/22 03:10:01,19.8835358992,61.701880544,1017.54598541 2016/05/22 03:20:01,19.7515395761,61.9901589655,1017.64427684 2016/05/22 03:30:01,19.6347737619,62.1997188195,1017.62728411 2016/05/22 03:40:01,19.5840060646,62.2786376915,1017.60293839 2016/05/22 03:50:01,19.5078545732,62.4077237848,1017.67772621 2016/05/22 04:00:01,19.426626388,62.6273830313,1017.7166415
このcsvをpythonで読み込んでグラフ化します。pythonでcsvを読み込むにはcsv
ライブラリを使う方法とpandas
を使う方法の2種類があります。pandas
の方が簡単に読み込めるのと、データの処理をする色々な機能があって便利なのでpandas
を使うことにします。pandas
便利ですね、昔知らずに頑張ってcsv
で頑張って読み込んでました。グラフ化するのは、matplotlibというライブラリを使うのが定番のようなのでそうします。
色々なサイトを調べまわった結果、以下のような10行程度のプログラムでcsvファイルを読み込んでグラフを描くことができました。
# -*- coding: utf-8 -*- import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv("sample.csv", index_col='time') df_tmp_humid = data.iloc[:, [0,1]] df_tmp_humid.plot() plt.savefig("tmp_humid.png") plt.show()
めずらしくちょっとだけプログラムの解説しますとdata = pd.read_csv("sample.csv", index_col='time')
でcsvファイルを読み込んでいます。csvファイルの1行目には項目名が入っている前提です(今回だとtime
, temperature
, humidity
、pressure
)。index_col='time'
で、インデックスとなる列を決めます。今回はtime
にしました。これを省略すると、勝手に1から順にインデックスナンバーが振られます。
df_tmp_humid = data.iloc[:, [0,1]]
は行と列の抽出です。ここでは、最初の':'は全部の行を表しています。また、'[0,1]'は、timeを除いた0番目の列(temperature)と1番目の列(humidity)を表しています。ここで、df_tmp_humid
には、temperature
とhumidity
の全行のデータが格納しています。
その後は、df_tmp_humid.plot()
でdf_tmp_humid
のデータをプロットして、画像ファイルに保存して、結果を表示しているだけですね。sample.csv
と同じディレクトリに上記のプログラムをdraw_graph.py
という名前で保存して以下のコマンド実行して下さい。
$ python3 draw_graph.py
実行するとグラフが表示されます(使用しているデータ量が違うので上記のデータをコピペしたものとは異なる見えかたにはなります)。グラフ。ちゃんと日付もそれらしく読み込めていて良い感じですね。
同じディレクトリにtmp_humid.png
というグラフの画像ファイルも保存できています。
オシャレなグラフの描き方
オシャレな見た目のグラフにしたい場合は、Seabornライブラリを使うのが良いです。以前はpipでseabornをインストールしないといけなかったようですが、matplotlibのバージョンが1.4以上だと、Seabornライブラリが無くても、matplotlibの機能でseabornのスタイルを使えるようです。
具体的にはグラフをplotする前にplt.style.use('ggplot')
と書くだけです。先ほどと同じようにグラフを表示するコマンドを実行すると以下のように表示されます。
おしゃれグラフ
Macのanaconda3-2.5.0でもRaspberry PiでもLinux(Ubuntu)でも問題なく表示されました。python3-matplotlib
パッケージのバージョンが古いとエラーとなるので$ sudo apt-get install python3-matplotlib
してバージョンを上げましょう。
どうしても古いmatplotlibでseabornスタイルを使いたい場合は、sudo pip3 install seaborn
でseabornライブラリをインポートしましょう。詳しくは下記サイトなど参照下さい。基本的には、プログラムの冒頭にimport seaborn as sns
を追加すれば使えます。
漫画みたいなグラフの描き方
漫画みたいなグラフにしたいときは、6行目のplt.style.use('ggplot')
をplt.xkcd()
に書き換えて下さい。以下のようなグラフが表示されます。
漫画みたいなグラフに関する詳細は以下のサイトを参照下さい。
5行でmatplotlibのグラフで日本語を使えるようにする方法(Macのみ)
matplotlibのグラフに日本語を表示しようとすると、以下のように四角(□、通称豆腐)が表示されてしまいます。
文字化けしているグラフ
一番手軽なのは、以下のように設定することです。
plt.rcParams['font.family'] = 'AppleGothic'
文字が正しく表示されたグラフ
ただ、これでも文字化してしまう文字があります。解消するには、少し面倒ですが、フォントをダウンロードして、フォントを所定の場所(~/Library/Fonts
)に移動した後、matplotlibのキャッシュを削除する必要があります。
そう聞くと面倒くさそうですが、実際は以下4行でOKです。
$ wget https://oscdl.ipa.go.jp/IPAexfont/ipaexg00301.zip $ unzip ipaexg00301.zip $ mv ipaexg00301/ipaexg.ttf ~/Library/Fonts/ $ rm ~/.matplotlib/fontList*.cache
ただし、最初の1行目実行してフォントをダウンロードする前に、以下サイトでライセンスを一読し、リンク先のアドレスを確認しておきましょう。ダウンロードするのは、IPAexゴシックですが、バージョンが変わるとファイル名の末尾が変わる可能性があります。
https://ipafont.ipa.go.jp/node26#jp
あとは、グラフを表示する前に、以下の1行を実行してフォントを設定しておけばOKです。事前準備の4行と合わせて5行で日本語設定が可能です。
plt.rcParams['font.family'] = 'IPAexGothic'
詳細は以下記事参照下さい。
matplotlib のグラフに日本語を表示する方法(文字化け対応) - akiyoko blog
ライブラリを使って日本語を使えるようにする方法
japanize-matplotlibというライブラリを使うことで、もっと手軽にMac以外でも日本語を使えるようにする方法があります。インストールは、以下コマンド実行するだけです。
$ pip install japanize-matplotlib
使いたいときは以下です。
import japanize_matplotlib
pip install して import するだけで matplotlib を日本語表示対応させる - Qiita
Google Colaboratoryでも使用できます。
Google Colaboratoryでもできた!matplotlib日本語化結構めんどくさいからこれ良いね https://t.co/zXialnPnZY pic.twitter.com/wlb7eReNmP
— からあげ (@karaage0703) 2018年10月11日
分かりやすいグラフを簡単に描くライブラリ
以下記事参照下さい
軸のコンパクトな指定方法
matplotlibユーザーには
— T. Tsukada (@hu_tsukada) August 27, 2021
ax.set_xlim([0,10])
ax.set_ylim([0,10])
ax.set_xlabel("lon")
...
みたいに冗長に書かずとも
ax.set(xlim=[0,10], ylim=[0,10], xlabel="lon", ...)
と一行で書けることをもっと広めていきたい
まとめ
pythonでcsvファイルを読み込んでグラフをかけるようになりました。pythonでデータ処理、分析から可視化まで完結できると便利ですね。データサイエンティスト的なお仕事するときにも便利に使えそうです(むしろ必須?)。今後は積極的に使っていきたいと思います。
他に、こんなグラフが描きたいけどどうやって描くんだろう?と思った時は以下のmatplotlibのサイトを見てみると良いと思います。
https://matplotlib.org/gallery.html
もしくは、以下のサイトも中々良さそうです。
グラフの見た目に拘りたい場合は、以下の記事も参考になると思います。
早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 - Qiita
Pandasのデータ処理に関しては、以下記事が決定版です!(断言)
今回、簡単にできたら「エクセルなんていますぐ捨てろ!」とかいう過激なタイトルをつけようと思っていたのですが、pythonで調べて思ったようにグラフを描くのは結構大変でした。なんだかんだでエクセルはやはり便利ですねw うまくツールを使い分けて、楽しい可視化ライフを送りましょう!
参考リンク
Pythonの画像描画ライブラリ「Matplotlib」の、機械学習で使われる典型的なグラフ機能:Pythonで始める機械学習入門(5)(1/3 ページ) - @IT
pandasでcsv/tsvファイルの読み書き | mwSoft
とにかくRaspberry Piにpython2 + numpy + matplotlibをインストールする - 或る阿呆の記
Pandas でデータフレームから特定の行・列を取得する – Python でデータサイエンス
http://installion.co.uk/ubuntu/vivid/universe/p/python3-seaborn/install/index.html
matplotlibで3Dグラフを描画する - white wheelsのメモ
【Python】pandas.DataFrameで複数条件指定時のエラーの対処 - Qiita
【Day-4】都道府県のデータをいじりながら、pandasを学ぶ - プロクラシスト
データ分析初心者向け、Pythonでデータ取得&グラフ描画する方法 - paiza times
早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 - Qiita
Kaggleで使える!Pandasテクニック集 - Qiita
入門pandas - 明日からはじめるデータ分析のきほん - Lean Baseball
グラフ作成のためのチートシートとPythonによる各種グラフの実装 - Qiita
PandasのIndexクラスを理解する|tomomoto|note
Kaggleで戦いたい人のためのpandas実戦入門 - ML_BearのKaggleな日常
早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 - Qiita
profitable_ai_book_info/notebooks/l2_03_matplotlib.ipynb at master · makaishi2/profitable_ai_book_info · GitHub
https://zenn.dev/zerebom/articles/48292f64e50735
CSVファイルのデータを手軽にグラフ化するGUIツールを作ってみた - EurekaMoments
関連記事
変更履歴
- 2021/08/28 軸の指定方法に関して追記
- 2019/01/28 参考リンク追加
- 2018/06/06 分かりやすいグラフを描くライブラリの紹介
- 2018/04/24 matplotlibのグラフで日本語を使用する方法を追記
- 2017/10/30 グラフを書くとき参考になるサイトを追加