Python Matplotlib

ソフトウェアのインストール方法

Python3のインストール

Mac/Linuxの場合

https://www.python.org/ からPython3.9.0をダウンロードしてインストールする。

Windows10の場合(1)

Python3.9.0 をダウンロードしてインストールする際に"Add Python 3.9 to PATH"を有効にする。 これはコマンドプロンプトやPowershellからpythonを実行するときに必要である。 attachment:python-install-windows.png

既に、インストールしておりPATHの登録だけ追加で行いたい場合は、再度インストーラーを実行して設定を変更するために"Modify"を選択する。 そして、"Advanced Options"の設定で"Add Python to environment variables"を有効にする。

attachment:python-install-modify1.png attachment:python-install-modify2.png

Windowsの場合には、後でPythonモジュールmatplotlibをインストールする際にC++コンパイラが必要なため、それもインストールする必要がある。 https://visualstudio.microsoft.com/ja/ からVisual Studio Community 2019 をダウンロードしてインストールする。その際、インストールするコンポーネントを選択できるので以下のように「C++によるデスクトップ開発」を選択してインストールする。ディスク領域を7 GB程度使用するので領域に余裕がない場合はLinuxシステムをインストールしてその中でPythonを使うようにした方がよいかもしれない。

attachment:VSinstall.png

Windows10の場合(2)

Windows System for LinuxやVirtual Boxという仮想化ソフトウェアを使ってLinux OSをWindows上のアプリケーションのように使うことができる。 挑戦したい人は以下のページを参考にやってみて下さい。Linux PCと同等の機能を使えるのでLinuxの扱いに慣れている人にとってはとても便利である。

Linuxの場合

Linuxではパッケージ管理ソフトウェアが標準で利用されているので、それを使って様々なソフトウェアを簡単にインストールすることができる。パッケージ管理ソフトウェアには主に2種類(apt, yum)あり、Linux OSの種類によってどちらかが採用されている。 パッケージ管理ソフトウェアでインストールされるバージョンは最新版とは限らないが、多少古いバージョンでもpython-3.X.Yであれば問題ない。

Ubuntu 20.04

ターミナル上で以下のコマンドを実行する。

apt install python3
apt install python3-pip

CentOS7, CentOS8

yum install python3
yum install python3-pip

Pythonの起動とモジュール管理ツール(pip/pip3)のインストール

Pythonはプログラミング言語であるとともに、開発・実行環境をインストールするとコード・インタープリタも一緒にインストールされる。インタープリタとは、プログラミング言語のソースコードを入力すると1行ずつ、その場でコードの意味を理解して適切な計算を行ってくれるものである。普通のプログラミング言語ではプログラムとしてまとまったソースコードを書き上げた後で、それをコンパイルして実行可能形式のプログラムに変換してから実行する必要があるが、インタープリタでは書いたコードが1行ずつ順に実行されるため、対話的なコードの記述・実行が可能である。

また、他のプログラミング言語と同様に様々な機能がライブラリという形で利用可能である。必要に応じてライブラリ(Pythonではモジュールと呼ばれる)をインストールして利用することができる。モジュール管理ツール(pipまたはpip3)も既にインストールされている。

Macの場合

ターミナル(Terminal)というアプリケーションを起動する。すると、コマンドラインでいろいろなコマンドを実行できる環境が立ち上がるとコマンドの入力を受け付ける状態(プロンプト)になっている。Python3を実行するには、コマンドプロンプトに以下のように入力する。

$ python3

これでPythonのインタープリタが起動し、対話的にコードを記述することが可能である。インタープリタを終了するにはCtrl-Dを押す(コントロール・キーを押しながらDキーを押す)。他にもexit()やquit()と入力して終了することもできる。

今回の演習ではnumpyとmatplotlibというモジュールを使用するので、それらをインストールする。

pip3 install numpy matplotlib scipy

ときどき、pip3のバージョンが古いのでアップグレードするように促されることがあるが、その場合は

pip3 install pip --upgrade

を実行してpip3のバージョンを更新する。 Linuxでも同様である。

Windows10の場合

すべてのプログラムから「Python 3.9」->「IDLE (Python 3.9 for 64-bit)」を選択して実行する。これでインタープリタが起動する。インタープリタを終了するにはCtrl-Z、exit()、quit()のいずれかを入力する。

モジュールをインストールするにはpip3を使うが、コマンド・プロンプトまたはPowershellというプログラムを使う。タスクバーの検索入力に"cmd"や"powershell"と入力すると候補を表示してくれるので、そこから選択して実行する。Powershellの方が少し使いやすい。これはMacやLinuxにおけるターミナルに相当するもの(上のMacの項を参照)で、コマンドを入力して実行することができる。そこで以下のように入力してモジュールをインストールする。

pip3 install numpy matplotlib --user

簡単のグラフの描画

Pythonインタープリタを起動して、以下のコードを入力してみる。

import matplotlib.pyplot as plot
import math
xdata = [ 0.1*i for i in range(100) ]
ydata = [ math.sin(x) for x in xdata ]
plot.plot(xdata, ydata, marker='o')
plot.show()

Pythonプログラミングの基礎

型・変数・演算

あらゆるプログラミング言語に共通することであるが、計算機で扱うもっとも単純な型として以下のものがある。

そして、これらのデータをプログラミング言語を使って利用するには変数を使うことができる。変数とは簡単にいうと、名前付きのデータのことである。Pythonでは、変数にはどのような型のデータでも代入することができる。

a = 12
b = 'Hello'

のような文では、変数aに12という整数型の値(データ)を代入、変数bに'Hello'という文字列型の値を代入している。

数値型や文字型のような基本的なデータ型以外に、より複雑な型も存在する。配列は複数のデータの順序付き集合である。順序付きの意味は、それぞれの要素に番号を付けられるということである。

a = [ 1, 2, 'a', 'b', 'Hello', 10.2]

というコードは変数aに配列を代入している。配列の各要素へはa[0], a[1]のように添字を指定することでアクセス可能である。

配列よりも複雑なデータ型としてクラスというものがあるが、これは任意のデータや関数をまとめた方である。

関数

数学に出て来る関数y=f(x)のように、入力データxから出力データyを計算するもの。数学の関数が多数の入力データを受け取れる(ベクトルからベクトルへの変換)ようにプログラミング言語における関数も複数の入力データを受け取って、出力を計算することができる。C/C++のような言語では出力データは一つしか返せないが、Pythonでは出力データを複数返すことも簡単にできる。 プログラミング言語では、関数への入力データのことを引数(ひきすう)と呼び、関数が返す値のことを返り値と呼ぶ。

def f(x):
  y = x*x
  return y

パラメータ付きの関数、例えばガウス分布や多項式も2つ目の引数を与えることで実現できる。

import numpy as np

def func_gaus(x, params):
  N = params[0]
  mu = params[1]
  sigma = params[2]
  z = (x - mu)/sigma
  y = N*np.exp(-z*z/2.0)
  return y

def func_polynomial3(x, params):
  p0 = params[0]
  p1 = params[1]
  p2 = params[3]
  p3 = params[4]
  y = p0 + p1*x + p2*x*x + p3*x*x*x
  return y

C/C++言語などでは関数の中身を{...}と括弧で括る必要があるが、Pythonでは簡潔なコードを書けるように括弧や文の後のセミコロン(;)を使わない。関数の中のコードは、上のように、行頭に空白を入れる(インデント)ことで判別できるようにする。したがって、Pythonではインデントは非常に重要である。また、上の関数ではガウス分布で指数関数を使用するためnumpyモジュールを読み込んでいる。math.expを使うこともできるが、numpy, matplotlibで使うことを考えるとnumpy.expの方が相性がよい。

Matplotlibによるグラフ描画

データを可視化するために様々な関数やグラフを作って表示させる。その際にmatplotlib.pyplotとnumpyというモジュールが便利である。これらを使用するには以下のimport文を使う。

import matplotlib.pyplot as plot
import numpy as np

matplotlibでデータを描画するには、描画するデータの種類によって

タイプ

必要なデータ

方法

散布図

x座標のリスト (x)、y座標のリスト (y)

plot.plot(x, y, marker='o')

ヒストグラム

データのリスト (x)、ビンの数 (nbins)、範囲 ([xmin, xmax])

plot.hist(x, nbins, [xmin, xmax])

関数

x座標のリスト (x)、y座標のリスト (y)

plot.plot(x, y) 多数の点を滑らかな曲線で結ぶ

これらの図を表示させるためのコード例を以下に示す。一定間隔の配列([ 0, 0.1, 0.2, ..., 1.0]等)を生成するのにnumpy.arangeという関数を使っている。

import numpy as np
import matplotlib.pyplot as plot

def func_gaus(x, params):
  N = params[0]
  mu = params[1]
  sigma = params[2]
  z = (x - mu)/sigma
  y = N*np.exp(-z*z/2.0)
  return y

x = np.arange(0, 100, 0.1)
y = func_gaus(x, params=[1.0, 50.0, 10.0])
plot.plot(x, y)
plot.show()

最小2乗法による関数のフィット

関数の定義

疑似データの生成

実際に何かを測定したデータがあればそれを使ってもよいが、ここでは疑似乱数を使ってデータを生成する。y = a*x+b+C*sin(w*x) という関数形のデータを生成してノイズを加える。

import numpy as np
import matplotlib.pyplot as plot
import random
def func_pol1n(x, params):
  a = params[0]
  b = params[1]
  C = params[2]
  omega = params[3]
  y = a*x + b + C*np.sin(omega*x)
  return y

ey = 0.2
x = np.arange(0, 20, 0.5)
y = func_pol1n(x, params=[1.0, 5, 2.0, 1.5])
for i in range(len(y)):
  y[i] += random.gauss(0.0, ey)

plot.plot(x, y, marker='o')
plot.show()

fout = open('pol1n.dat', 'w')
for i in range(len(x)):
  n = fout.write('%10.5f %10.5f\n' % (x[i], y[i]))

fout.close()

生成したデータはpol1n.datという名前のファイルに保存される。

フィット

データに関数を最小2乗法によってフィットするには、データとフィットする関数を用いてカイ2乗を定義する。カイ2乗はパラメータの関数となる。 そして、カイ2乗を最小化するパラメータの値を求める。関数を最小化させる問題は、様々な局面で現れるもので数値的に最小化を行うために様々な方法が知られている。 ここでは、Pythonのscipy.optimize.curve_fit(...)という関数を使った例を示す。curve_fit関数にはx, y座標データ、関数の定義、そしてパラメータの初期値を与える。

import matplotlib.pyplot as plot
import scipy.optimize
import numpy as np

def func_pol1n(x, params):
  a = params[0]
  b = params[1]
  C = params[2]
  omega = params[3]
  y = a*x + b + C*np.sin(omega*x)
  return y

def wrap_func_pol1n(x, p0, p1, p2, p3):
  return func_pol1n(x, [p0, p1, p2, p3])

x, y = [], []
fin = open('pol1n.dat', 'r')
for line in fin.readlines():
  words = line.split()
  if len(words)>=2:
    print(words)
    x.append(float(words[0]))
    y.append(float(words[1]))
x = np.array(x)
y = np.array(y)

results = scipy.optimize.curve_fit(f=wrap_func_pol1n, xdata=x, ydata=y, p0=[1.0, 5.0, 2.0, 1.5])
params, cov = results
plot.plot(x, y, marker='o')
plot.plot(x, func_pol1n(x, params))
plot.show()
print(params)

MatplotlibTutorial (最終更新日時 2021-10-04 05:11:13 更新者 TakanoriKono)