linuxBean14.04(73)matplotlibでアニメーションのグラフ

2015-09-26

旧ブログ

t f B! P L

前の関連記事:linuxBean14.04(72)Anacondaで科学技術系Pythonパッケージを一括インストールする


Thumbnail gallery — Matplotlib 1.4.3 documentationにたくさんの例が載っています。それぞれのグラフをクリックするとソースコードが表示されるのでそれをIPython Notebookに貼り付けると実際の動作が確認できます。アニメーションのグラフの例もみつけました。

matplotlibによるグラフの例と解説


matplotlib入門 - りんごがでている

順を追って書いてありとてもわかりやすいです。

すべての例は以下のインポート文の挿入が前提になっていますのでIPython Notebookの最初のセルで実行しておきます。
import numpy as np
import matplotlib.pyplot as plt
例の最後にplt.show()をつけておくとグラフ前にでてくるOut[ ]の出力の抑制ができます。

「オブジェクト指向なプロット」の部分がとても参考になりました。

最初にplt.figure()でmatplotlib.pyplot.figure()の戻り値のmatplotlib.figure.Figureクラスのインスタンスを得ています。

matplotlib.figure.Figureクラスのadd_subplot()メソッドで今度はmatplotlib.axes.Axesクラスのインスタンスを得ています。

そしてmatplotlib.axes.Axesクラスのplot()メソッドでグラフを描画しています。

アニメーションのグラフの例


Matplotlib tutorial

左の列にmatplotlib: python plotting — Matplotlib 1.4.3 documentationへのリファレンスが載っていて勉強しやすいです。

Figures, Subplots, Axes and TicksQuick referencesに凡用例がでていて役立ちそうです。

Animationでは自律的に動くグラフが紹介されています。

グラフをクリックするとソースコードが表示されます。

Drip Dropは水滴が水面に落ちるような動きをします。

Jupyter Notebookでmatplotlibのインライン表示をしているとpngで出力されるためアニメーションが見れません。
animation.save('rain.gif', writer='imagemagick', fps=30, dpi=72)
最終行から2番目の行をこのようにして実行するとローカルフォルダにrain.gifというgifアニメが保存されます。

セルのタイプをCodeからMarkdownに変更して![image](rain.gif)と入力してRunするとJupyter Notebook上でgifアニメをみることができます。

linuxBean14.04(71)IPython3.2.1のNotebookを使うで設定したc.InteractiveShellApp.matplotlib = "inline"をコメントアウトしてインライン表示をオフにするとIPython Notebookでも別ウィンドウでアニメーションをみることができます。

今回は普通にPyCharm4.5でpyファイルを作ってそこにコピペして実行しました。

matplotlib.animation.FuncAnimationクラスをインスタンス化しています。

最後から2行目のコメントアウトをはずして実行すると実行したフォルダにrain.gifが作成されます。



次に紹介されているEarthquakesの例も面白いです。

過去30日間の地球上の地震のデータをフィードで取得して地図上に表示させます。

地図の表示にはbasemapパッケージのインストールが必要です。

basemap 1.0.7のインストール


anaconda/basemap (1.0.7)

ここからインストールしました。

Anaconda3がインストールしてある必要があります。(linuxBean14.04(72)Anacondaで科学技術系Pythonパッケージを一括インストールする参照。)

conda install -c https://conda.binstar.org/anaconda basemap
pq@pq-VirtualBox:~$ conda install -c https://conda.binstar.org/anaconda basemap
Fetching package metadata: ......
Solving package specifications: .
Package plan for installation in environment /home/pq/anaconda3:

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    geos-3.3.3                 |                0        14.4 MB
    wheel-0.24.0               |           py34_0          77 KB
    basemap-1.0.7              |       np19py34_0       118.8 MB
    ------------------------------------------------------------
                                           Total:       133.2 MB

The following NEW packages will be INSTALLED:

    basemap: 1.0.7-np19py34_0
    geos:    3.3.3-0         

The following packages will be DOWNGRADED:

    wheel:   0.26.0-py34_1 --> 0.24.0-py34_0   

Proceed ([y]/n)? 
なぜかwheelのダウングレードを求められます。

インストールは簡単に終わりました。

地図状に地震データを表示する例


Matplotlib tutorialにある地図状に地震データを表示する例をやってみます。

Animationの節の一番したにある世界地図をクリックするとソースコードが表示されますので、それをPyCharm4.5にコピペします。

プロジェクトのインタープリターは先ほどbasemap 1.0.7をインストールしたPythonを指定します。
(デフォルトインストールでは~/anaconda3/bin/python3.4のはず。)

urllib.urlopen()はPython3では廃止されてurllib2.urlopen()になると書いていますが、さらにurllib2モジュールはPython 3.0で urllib.request, urllib.error に分割されると書いてあります。

2to3で自動的に修正できるのでそれで変換します。

ソースコードを073Earthquake.pyというファイル名に保存したとします。

2to3 -w 073Earthquake.py

これで自動的に修正してくれました。

修正前のファイルは.bakをつけて保存されています。

ところがまだエラーがでてきます。
Traceback (most recent call last):
  File "/home/pq/PycharmProjects/Jupyter/073Earthquake.py", line 36, in <module>
    data = url.read().split('\n')[+1:-1]
TypeError: 'str' does not support the buffer interface
split以降をはずしてみるとdataにはバイト型の文字列が入っていることがわかります。

Python 2 から Python 3 への移植 — Python 3.4.3 ドキュメントを読んでも解決法がよくわかりませんね。
data = url.read().decode('utf8')
としてdataを前もってバイト型から文字列に変換しても同じエラーがでてきます。

蛇とstrとシリアルと〜pantilt雲台の場合〜 - すこしふしぎ.に解法を教えていただきました。
data = url.read().split(b'\n')[+1:-1]
先ほどとは逆に文字列型の方をバイト型にすればエラーがでなくなりました。
    row = data[i].split(b',')
40行目も同様にして修正しました。

これでうまく出力できました。
animation.save('earthquake.gif', writer='imagemagick', fps=30, dpi=72)
Drip Dropの例のときと同様にこの行を追加して結果をgifアニメに保存しました。

これはmatplotlib.animation.Animationクラスのsave()メソッドでwriterでImageMagickというプログラムを呼び出して実行されています。


インストールした記憶はありませんが、Synapticパッケージマネージャをみると6.7.7がインストールされていました。

condaがインストールしてくれたのでしょうか?

imagemagickのPython実装のPythonMagickはPythonパッケージでもUbuntuパッケージでもインストールされていませんでした。

出力は1000x720ピクセル、2.9MBもある大きなファイルになりました。
Matplotlib Basemap Tutorial: Plotting global earthquake activity | peak 5390

コードの詳しい解説はこちらにあります。

参考にしたサイト


Thumbnail gallery — Matplotlib 1.4.3 documentation
グラフをクリックするとソースコードが表示されます。

matplotlib入門 - りんごがでている
順を追ってグラフの描き方が解説されていてとてもわかりやすいです。

Plotting commands summary — Matplotlib 1.4.3 documentation
matplotlib.pyplotのコマンドリファレンス。

Matplotlib tutorial
アニメーションの例や汎用例がたくさん載っています。

Welcome to the Matplotlib Basemap Toolkit documentation! — Basemap Matplotlib Toolkit 1.0.8 documentation
matplotlibとこのbasemapを使えば地図状にグラフ表示できます。

anaconda/basemap (1.0.7)
condaを使って簡単にbasemapをインストールできました。

25.4. 2to3 - Python 2 から 3 への自動コード変換 — Python 2.7ja1 documentation
地震のグラフの例はPython3への変換が必要でした。

Python 2 から Python 3 への移植 — Python 3.4.3 ドキュメント
上記の2to3を使っても不完全な変換なので修正が必要なのですがあまり参考になりませんでした。

Physical Entity-Oriented Python Learning Experiment: Gifアニメーション
matplotlibのアニメーションをgifアニメに保存する方法やJupyter Notebookにインライン表示する方法。

蛇とstrとシリアルと〜pantilt雲台の場合〜 - すこしふしぎ.
2to3では文字列の型変換はしてくれないので自分でする必要がありました。

ImageMagick: Convert, Edit, Or Compose Bitmap Images
matplotlibで作成したアニメーションの保存はこのImageMagickを呼び出して行いました。

GiF Resizer - k本的に無料ソフト・フリーソフト
地震のグラフのgifアニメを縮小しようとしましたがこのソフトでは真っ黒になってできませんでした。

Matplotlib Basemap Tutorial: Plotting global earthquake activity | peak 5390
地震のデータをbasemapとmatplotlibを使ってグラフ表示する方法。

次の関連記事:linuxBean14.04(74)ipywidgetsでJupyter Notebookのウィジェット

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ