Python グラフ描画用関数

提供:yonewiki

Pythonの記事へ戻る

概要

Pythonista3でグラフ描画関数およびここで紹介する算術関数を利用する場合は

import matplotlib.pyplot as 変数名
import numpy as 変数名

という記載が必要になります。

関数という表現をしていますがメソッドといった方がいいのかもしれません。でもここではあえて関数という日本語を使ってみようかなっておもいます。なるべく。そんな気分。てへぺろ? では記事を進めましょう。


 話を進める、その前に…


 この記事の発展的な記事がPython matplotlibで学ぶ…グラフ描画プログラムにもあります。これはPython matplotlibを使って学ぶ統計処理 正規分布のために書かれた記事です。


 では、話を進めるとして、



グラフ描画関係サンプル

まずは簡単なグラフ描画サンプルを示します。python3.6の実行環境がある人はそのまま貼り付けて実行してみるとよいと思います。それから記事を読み進めると理解が深まるかもしれません。

# coding ' utf-8'
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 100, 1)
y = np.sin(x * np.pi / 30)

params = ["sample"]

fig = plt.figure(figsize=(8,6))
fig.subplots_adjust(hspace=0.5)

for i, p in enumerate(params, 1):
	ax = fig.add_subplot(3, 1, i)
	ax.plot(x, y) 

	ax.set_xticks(np.linspace(0, 100, 5))
	
	ax.set_yticks(np.linspace(-1, 1, 3))
		
	ax.set_xlabel('time[sec]')
	ax.set_ylabel('voltage[V]')
	ax.set_title('time vs voltage plot')
	ax.set_title("title='{}'".format(p))
	
plt.show()

実行結果

Python PlotSample

グラフ描画関係 書きかけの記事です。20191226~

*NumPyオブジェクト変数名.arange(引数1,引数2,引数3,引数4)

等差数列を生成するnumpy.arange関数です。
NumPyオブジェクト変数名.arange(1, 100, 2, dtype = 'int')

import numpy as np
np.arange(1, 100, 2, dtype = 'int')
引数1は初期値 省略可能で省略時は0
引数2は終了値 省略不可で指定が必須
引数3はステップ値 省略可能で省略時は1
引数4でデータ型の指定ができます 省略可能で省略時は引数2のデータ型から自動予測

dtypeはデータ型を指定しても良いですし、それに対応する型コードと呼ばれるものを指定しても良いです。ちなみにintはint64と同じで、floatはfloat64、strはunicode、uintはuint64と同じです。

dtype = 'int8' dtype = 'i1'  ■符号あり8ビット整数型

dtype = 'int16' dtype = 'i2'  ■符号あり16ビット整数型

dtype = 'int32' dtype = 'i4'  ■符号あり32ビット整数型

dtype = 'int64' dtype = 'i8'  ■符号あり64ビット整数型

dtype = 'uint8' dtype = 'u1'  ■符号なし8ビット整数型

dtype = 'uint16' dtype = 'u2'  ■符号なし16ビット整数型

dtype = 'uint32' dtype = 'u4'  ■符号なし32ビット整数型

dtype = 'uint64' dtype = 'u8'  ■符号なし64ビット整数型

dtype = 'float16' dtype = 'f2'  ■半精度浮動小数点型(符号部1ビット、指数部5ビット、仮数部10ビット)

dtype = 'float32' dtype = 'f4'  ■単精度浮動小数点型(符号部1ビット、指数部8ビット、仮数部23ビット)

dtype = 'float64' dtype = 'f8'  ■倍精度浮動小数点型(符号部1ビット、指数部11ビット、仮数部52ビット)

dtype = 'float128' dtype = 'f16'  ■四倍精度浮動小数点型(符号部1ビット、指数部15ビット、仮数部112ビット)

dtype = 'complex64' dtype = 'c8'  ■複素数(実部・虚部がそれぞれfloat32)

dtype = 'complex128' dtype = 'c16'  ■複素数(実部・虚部がそれぞれfloat64)

dtype = 'complex256' dtype = 'c32'  ■複素数(実部・虚部がそれぞれfloat128)

dtype = 'bool' dtype = '?'  ■ブール型(True or False)

dtype = 'unicode' dtype = 'U'  ■Unicode文字列

dtype = 'object' dtype = 'O'  ■Pythonオブジェクト型


*NumPyオブジェクト変数名.linspace(引数1, 引数2, 引数3, 引数4, 引数5, 引数6)

等差数列を生成するnumpy.linspace関数です。linespaceではありません。lineのようにnの後ろにeをつけるスペルミスや勘違いを起こしやすいかもしれませんが、そうではないので気を付けてください。linspaceですarange関数とよく似ている機能ですが引数が豊富で多機能です。

import numpy as np
np.linspase(1, 100, 50, endpoint = True, restep = True, dtype = 'int')

例2

result = np.linspace(1, 100, 50, endpoint=False, restep=True)
array, step = result
print(step)
引数1は初期値 省略不可で指定が必須
引数2は終了値 省略不可で指定が必須
引数3はステップ値 省略可能で省略時は50ただし終了値が最終値になるように指定がある場合で省略されている場合は、等間隔になるように自動調整される。
引数4は終了値を優先しない場合にfalseを指定する 省略可能で省略時はTrueで終了値が最終値になるようにちょうせいされる。
引数5は戻り値(タプル型配列で返却)にステップを指定する 省略可能で省略時はFalse
引数6でデータ型の指定ができます 省略可能で省略時は引数2のデータ型から自動予測

*matplotlib.pyplotオブジェクト変数名.plot(引数1,引数2)

  • matplotlib.axes._subplotsAxesSubplotオブジェクト変数名.plot(引数1,引数2)
グラフを生成するmatplotlib.pyplotオブジェクト変数名.plot関数です。
グラフを生成するmatplotlib.axes._subplotsAxesSubplotオブジェクト変数名.plot関数です。
matplotlib.pyplotオブジェクト変数名.plot(x, y)

import matplotlib.pyplot as pl
pl.plot(x, y)

あるいは

x =[1, 2, 3, 4, 5]
y =[1, 2, 3, 4, 5]
fig = pl.figure()
axis = fig.add_subplot(1,1,1)
axis.plot(x, y)
引数1はデカルト座標系でいうところのX軸(横方向) 省略不可で指定が必須
引数2はデカルト座標系でいうところのY軸(縦方向) 省略不可で指定が必須
通常引数には数列や配列など変化を伴う数値を保持する変数を指定します。

*matplotlib.axes._subplotsAxesSubplotオブジェクト変数名.set_xticks

グラフのX軸目盛りを調整するmatplotlib.axes._subplotsAxesSubplotオブジェクト変数名.set_xticks関数です。 axis.set_xticks(引数1)

x =[1, 2, 3, 4, 5]
y =[1, 2, 3, 4, 5]
fig = pl.figure()
axis = fig.add_subplot(1,1,1)
axis.plot(x, y)
axis.set_xticks([1,2,3,4,5])
引数1は目盛りを表示したい数値を配列で直接表記しても良いですし、最初に示したサンプルのように等差数列の配列を返すlinspaceのような関数を使ってもよいです。最初のlispaceでは0,100,5という引数なので0から100までの数値から5つの数値を返せと指示したので0,25,50,75,100の5つの数値がX軸の目盛りとして使われています。


*matplotlib.axes._subplotsAxesSubplotオブジェクト変数名.set_yticks

グラフのX軸目盛りを調整するmatplotlib.axes._subplotsAxesSubplotオブジェクト変数名.set_yticks関数です。 axis.set_yticks(引数1)

x =[1, 2, 3, 4, 5]
y =[1, 2, 3, 4, 5]
fig = pl.figure()
axis = fig.add_subplot(1,1,1)
axis.plot(x, y)
axis.set_yticks([1,2,3,4,5])
引数1は目盛りを表示したい数値を配列で直接表記しても良いですし、最初に示したサンプルのように等差数列の配列を返すlinspaceのような関数を使ってもよいです。最初のlispaceでは-1,1,3という引数なので-1から1までの数値から3つの数値を返せと指示したので-1,0,1の3つの数値がY軸の目盛りとして使われています。


*matplot.pyplotオブジェクト.figure

グラフを生成するmatplotlib.pyplotオブジェクト変数名.figure(figsize=(8, 6))

引数1にはグラフの大きさを指定することができる。単位はインチで縦、横の順番でfigsize=(8, 6)のように指定する。8,6はデフォルトの値。
import matplotlib.pyplot as pl
fig = pl.figure(figsize=(8, 6))

*matplotlib.figure.Figureオブジェクト変数名.subplots_adjust(hspace=xxx, wspace=xxx)

グラフを生成するmatplotlib.figure.Figureオブジェクト変数名.subplots_adjust(hspace=xxx, wspace=xxx) 左右の余白は wspace、上下の余白は hspace で指定します。デフォルト値は上下間 左右間 共に0.2で、上下はデフォルトだとグラフタイトルと目盛りが重なりやすいようです。上下左右にグラフを並べない場合は特に意味は無い指定になります。

import matplotlib.pyplot as pl
fig = pl.figure()
fig.subplots_adjust(wspace=0.4, hspace0.4)

*matplotlib.figure.Figureオブジェクト変数名.add_subplot

一つの描画エリアにグラフを複数を作成する関数 matplotlib.figure.Figureオブジェクト変数名.add_subplot(引数1,引数2,引数3)

import matplotlib.pyplot as pl
import numpy as np

x = np.arange(0, 100, 1)
y = np.sin(x * np.pi / 30)

params = ["sample1","sample2","sample3","sample4"]

fig = pl.figure(figsize=(8,6))
fig.subplots_adjust(hspace=0.5)

for i, p in enumerate(params, 1):
	ax = fig.add_subplot(2, 2, i)
引数1は作成するグラフの行数
引数2は作成するグラフの列数
引数3はグラフインデックス位置指定番号 左上隅から順番に右へと番号が振られていて、一番右まで行ったら一つ下の左隅から番号が振られ、最後は右隅で番号が終わる。表の中でセルが結合したような形式のグラフ配置になっているような複雑なグラフをadd_subplot関数で作成することはできないので、複雑な配置を実現したい場合は違う方法を用いる。matplotlibライブラリのgridspecオブジェクトにあるGridSpec関数とpyplot オブジェクトのsubplot関数で複雑な引数を指定することで特殊な配置にすることができます。あるいはpyplot オブジェクトのaxes関数で複雑な指定をするとPicture in Pictureみたいにグラフの中にグラフを配置することもできます。後ほど紹介できたらと思います。

先の例のように(2,2,i)という引数の場合以下のような2行2列の4つのマスからなるグラフになりiが1のときは左上隅のグラフを生成しようとする動きをし、次に2、そして3、最後に4という順番に処理が進むことになります。

1 2
3 4


*matplotlib.axes._subplotsAxesSubplotオブジェクト変数名.set_xlabel('引数1')

matplotlib.axes._subplotsAxesSubplotオブジェクト変数名.set_xlabel('time(sec)')

axis.set_xlabel('time(sec)')
引数1はデカルト座標系でいうところのX軸(横方向)に表示する軸の意味を表示するための文字列を記述します。
関数を使う場合は引数の省略は不可で指定が必須

*matplotlib.axes._subplotsAxesSubplotオブジェクト変数名.set_ylabel('引数1')

matplotlib.axes._subplotsAxesSubplotオブジェクト変数名.set_ylabel('voltage(V)')

axis.set_ylabel('voltage(V)')
引数1はデカルト座標系でいうところのY軸(縦方向)に表示する軸の意味を表示するための文字列を記述します。
関数を使う場合は引数の省略は不可で指定が必須

*matplotlib.axes._subplotsAxesSubplot.pyplotオブジェクト変数名.set_title('引数1')

matplotlib.axes._subplotsAxesSubplotオブジェクト変数名.set_title('time vs voltage plot')

axis.set_title('time vs voltage plot')
グラフの意味を表示するための文字列を記述します。グラフの上部に表示されます。
関数を使う場合は引数の省略は不可で指定が必須


*matplotlib.axes._subplotsAxesSubplotオブジェクト変数名.grid('引数1','引数2','引数3','引数4',…)

グラフのグリッド主線と補助線の形状を変更する関数です。 例

ax.grid(b=True, which='major', axis='x', color=#ff0000)
引数1~全て省略可能な引数です。引数4からは公式には**kwargsと呼ばれています。*argsというのが引数というものを意味していますが、*がついているのはC言語のポインタ的なニュアンスと考えるとして、ホントか?それにkwがついているのはタプル型を意味するところのキーワードつまりはkeywordのことを意味しているのではないかとのことです。ようするにいろいろな引数を何とか=何とかの形式で沢山つけれるよっていうことだと思ってよいかと思います。何が言いたいかといいますと公式サイトとかで出てくる**kwargsっていう表現ににびびるなってことです。要するに**kwargsが使える関数は便利と思ってよいかと思います。使いこなすには覚えることも多いっちゃおおいけど。多機能で便利とポジティブに考えても良いんじゃないかな。


引数1はb=Trueでグリッド表示するということb=Noneで非表示。
引数2はwhich='major'で主線に対する処理 which='minor'で補助線に対する処理 which='both'で両方に対する処理になります。
引数3はaxis='x'でx軸に対する処理 axis='y'でy軸に対する処理 axis='both'で両方の軸に対する処理になります。

要するにデザイン関連の処理をまとめてやるか、めんどうだけど見やすさとかデザインのことだから個別に設定する必要があるからxはxだけyはyだけ主線と補助線とで個別にデザインを分けるとかで個別に設定をしなければならないとかまとめて統一したデザインができるとかで楽したいとかいろいろできるということです。そのこまごまとした設定を引数4以降で設定するということになります。わりかしたくさんの設定があります。理解するのも大変なくらい項目が沢山あります。


ここでは項目の紹介だけにとどめます。ゆくゆくはひとつづつ紹介したいですね。

引数キーワード 引数 値
agg_filter (m,n,3)float配列とdpi値を取り、(m,n,3)配列を返すフィルター関数
alpha float浮動小数点数値
animated ブール ex animated=True animated=False
antialiased またはAA ブール ex antialiased=True antialiased=False
clip_box Bbox 後述
clip_on ブール ex clip_on=True clip_on=False
clip_path [( Path, Transform )or Patch or 無し]画像の読み込み+その読み込み範囲の設定などの手順を伴う非常に難しい指定です。またべつの記事で説明が必要なほどのものだと思います。
color またはc 色#000000~#ffffff ex color=#000000 etc
contains 呼び出し可能
dash_capstyle {'butt', 'round', 'projecting'}
dash_joinstyle {'miter', 'round', 'bevel'}
dashes ダッシュシーケンスを設定します。

ダッシュ シーケンスは、点のダッシュとスペースの長さを表す偶数長の浮動小数点数のシーケンスです。 たとえば、(5, 2, 1, 2) は、2 ポイントスペースで区切られた 5 ポイントと 1 ポイントのダッシュのシーケンスを表します。

drawstyle またはds {'default', 'steps', 'steps-pre', 'steps-mid', 'steps-post'}, デフォルト: 'default'
figure Figure
fillstyle {'full', 'left', 'right', 'bottom', 'top', 'none'}
gid str 文字列
in_layout ブール in_layout=True in_layout=False
label 対象
linestyle またはls {'-', '-', '-。', ':', ,(offset、on-off-seq),...}
linewidth またはlw float浮動小数点数値
marker マーカー 一覧は後述
markeredgecolor またはmec 色#000000~#ffffff ex color=#000000
markeredgewidth またはmew float浮動小数点数値
markerfacecolor またはmfc 色#000000~#ffffff ex color=#000000
markerfacecoloralt またはmfcalt 色#000000~#ffffff ex color=#000000
markersize またはms float浮動小数点数値
markevery Noneまたはintまたは(int、int)またはsliceまたはList [int]またはfloatまたは(float、float)
path_effects AbstractPathEffect
picker floatまたはcallable [[Artist、Event]、Tuple [bool、dict]]
pickradius float浮動小数点数値
rasterized boolまたはNone ex rasterized=True rasterized=False rasterized=None
sketch_params (スケール:float、長さ:float、ランダムネス:float)
snap boolまたはNone ex snap=True snap=False snap=None
solid_capstyle {'butt', 'round', 'projecting'}
solid_joinstyle {'miter', 'round', 'bevel'}
transform Transform
url str 文字列
visible ブール ex visible=True visible=False
xdata 1次元配列
ydata 1次元配列
zorder float浮動小数点数値
BBoxの例
bbox=[0,0,1,1]
marker = {'.': 'point', ',': 'pixel', 'o': 'circle', 'v': 'triangle_down', '^': 'triangle_up', '<': 'triangle_left', '>': 'triangle_right', '1': 'tri_down', '2': 'tri_up', '3': 'tri_left', '4': 'tri_right', '8': 'octagon', 's': 'square', 'p': 'pentagon', '*': 'star', 'h': 'hexagon1', 'H': 'hexagon2', '+': 'plus', 'x': 'x', 'D': 'diamond', 'd': 'thin_diamond', '|': 'vline', '_': 'hline', 'P': 'plus_filled', 'X': 'x_filled', 0: 'tickleft', 1: 'tickright', 2: 'tickup', 3: 'tickdown', 4: 'caretleft', 5: 'caretright', 6: 'caretup', 7: 'caretdown', 8: 'caretleftbase', 9: 'caretrightbase', 10: 'caretupbase', 11: 'caretdownbase', 'None': 'nothing', None: 'nothing', ' ': 'nothing', : 'nothing'}

*matplotlib.pyplotオブジェクト変数名.show()

複数のグラフの作成も纏めて生成できるmatplotlibによるグラフ描画の下準備の手順が存在することがここまでの手順でわかったと思いますが、最後にこの関数を実行することでここまでじゅんびしてきたものが実際に描画されます。上手くいかない場合は、ここまでやってきた準備にまずかった部分があったということになります。このような実際に描いてみるまで、上手くいっているかよくわからないという仕組みが使いやすいとは思えないですが、使いこなせたら凄いのかもしれないですね。

import matplotlib.pyplot as plt
…
plt.show()

算術関数関係

*NumPyオブジェクト変数名.pi

円周率をあらわす予約語です。およそ3.14159265359として計算されるようになっています。
円周は直径×円周率で求めることができます。2*半径*piです。面積は半径×半径×円周率で求めることが出来ます。
その他いろいろな場面で円周率を利用することで問題を解決するのに役立てることが出来ます。

*NumPyオブジェクト変数名.sin(引数1)

グラフ描画でよく使う算術関数です。
例 NumPyオブジェクト変数名.sin(2*pi*v)
引数1はラジアンという単位で指定する角度です。単位円の中の三角形の角度に対する弧のことです。 省略不可で指定が必須
詳しくはこちらの解説を確認してみてください。

*NumPyオブジェクト変数名.cos(引数1)

グラフ描画でよく使う算術関数です。
例 NumPyオブジェクト変数名.cos(2*pi*v)
引数1はラジアンという単位で指定する角度です。単位円の中の三角形の角度に対する弧のことです。 省略不可で指定が必須
詳しくはこちらの解説を確認してみてください。

*NumPyオブジェクト変数名.tan(引数1)

グラフ描画でよく使う算術関数です。
例 NumPyオブジェクト変数名.tan(2*pi*v)
引数1はラジアンという単位で指定する角度です。単位円の中の三角形の角度に対する弧のことです。 省略不可で指定が必須
詳しくはこちらの解説を確認してみてください。


関連記事

Python matplotlibで学ぶ…グラフ描画プログラム


  Pythonの記事へ戻る