Python matplotlibで学ぶ…グラフ描画プログラムのソースを表示
新しいページはコチラ
移動:
案内
,
検索
== '''概要''' == pythonによるグラフ描画プログラムを以下に示します。 <syntaxhighlight2 lang="python" enclose="div" line> from pylab import * from matplotlib import rcParams import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.ticker as tick import sys as system import math import matplotlib.font_manager as fm from matplotlib.font_manager import FontProperties #iPad Font Example #fp=FontProperties(fname=r'/private/var/mobile/Containers/Shared/AppGroup/133F326C-1CD8-49C6-9B85-7BBA53194CA4/Pythonista3/Documents/site-packages/ipaexg.ttf') #Windows Font fp=FontProperties(fname=r'MS Gothic') #図にグラフ(111)を追加 ax = fig.add_subplot(1, 1, 1, zorder=0) #軸目盛りを追加 ax.tick_params(which='major',direction='inout', bottom = True, left = True, top = False, right = False, labelsize=5, width = 0.8, length = 4, color='black', zorder=1) ax.tick_params(which='minor',direction='inout', bottom = True, left = True, top = False, right = False, labelsize=5, width = 0.5, length = 2, color='black', zorder=1) #軸の目盛り線設定 ax.xaxis.grid(linewidth=0.2, which='minor', ls=':', zorder=-4) ax.xaxis.grid(linewidth=0.3, which='major', ls='-', zorder=-5) ax.yaxis.grid(linewidth=0.2, which='minor', ls=':', zorder=-6) ax.yaxis.grid(linewidth=0.3, which='major', ls='-', zorder=-7) #目盛りの範囲設定と目盛りの挿入位置設定 ax.set_ylim(-3.01, 3.01) ax.set_yticks(np.arange( -3.0, 3.1, step = 1)) ax.set_yticks(np.arange( -3.0, 3.0, step = 0.25), minor=True) ax.set_xlim(-8.01, 8.05) ax.set_xticks(np.arange(-8, 8.1, step = 2)) ax.set_xticks(np.arange(-8, 8, step = 0.5), minor=True) #グラフの枠の設定 ax.spines['bottom'].set_position('zero') ax.spines['bottom'].set_linewidth(0.8) ax.spines['bottom'].set_color('black') ax.spines['left'].set_position('zero') ax.spines['left'].set_linewidth(0.8) ax.spines['left'].set_color('black') ax.spines['top'].set_linewidth(0) ax.spines['right'].set_linewidth(0) #軸ラベル位置 ax.yaxis.set_label_coords(-0.03, 0.50) ax.xaxis.set_label_coords( 0.50, -0.03) #軸の基準位置に矢印を追加 ax.annotate(s='',xy=(0, 3.01),xytext=(0, -3.01),xycoords='data',\ arrowprops=dict(facecolor='black',arrowstyle='->, head_width=0.3',lw=0.5,shrinkA=0,shrinkB=0)) ax.annotate(s='',xy=(8.05, 0),xytext=(-8.01, 0),xycoords='data',\ arrowprops=dict(facecolor='black',arrowstyle='->, head_width=0.3',lw=0.5,shrinkA=0,shrinkB=0)) #グリッドをグラフデータの後ろに隠す。 ax.set_axisbelow(True) #グリッド有効化 ax.grid(True, zorder=-1) #グラフの位置 ax.set_position([0.2, 0.2, 0.7, 0.6]) #ラベルの文字設定 ax.set_xlabel('x [-]', fontsize = 6, fontdict={'family': 'Meiryo'}) ax.set_ylabel('y = f(x)[-]', fontsize = 6, fontdict={'family': 'Meiryo'}) ax.set_title('散布図の連続描画による関数グラフ', fontsize = 8, fontdict={'family': 'Meiryo'}) u = 0 sigma = 1 #sigmaの初期値 while sigma < 2:#sigmaの値を変えて複数の線を描画したい場合はココを増加させたり、初期値を変えたりする。 if sigma != 0: #sigmaが0のときは計算不能なので、処理しない。関数独自のエラー回避。 #確率密度関数の計算結果をx配列値全てについて計算し、yに配列として格納 y = 1 / (np.sqrt(2 * np.pi) * sigma) * np.power(math.e ,-1 / (2 * np.power(sigma, 2)) * np.power((x - u), 2)) #グラフとy軸基準の内側を塗りつぶす設定。斜線パターン plt.fill_between(x, y, facecolor="none", alpha=0.8, edgecolor='#1f77b4', hatch="//////", zorder = 15) #hach Pattern = / \ | - + x o O . * #1f77b4 #xとsの関係をグラフに連続値としてプロット ax.plot(x, y, linestyle='solid', linewidth = 0.8, zorder = 15 + sigma) #次のsigmaの値について描画?この例ではsigmaが1のときの1回だけプロットして終わる。 sigma += 1 #プロット結果を標準出力で表示 plt.show() </syntaxhighlight2> === '''12行目/13行目''' === <syntaxhighlight2 lang="python" enclose="div"> #iPad Font Example #fp=FontProperties(fname=r'/private/var/mobile/Containers/Shared/AppGroup/133F326C-1CD8-49C6-9B85-7BBA53194CA4/Pythonista3/Documents/site-packages/ipaexg.ttf') </syntaxhighlight2> #でコメント化をしていますが、iPadのPythonista3でpythonプログラムをする場合はこちらを有効化して使うべき例として記述しました。但し、ipaexg.ttfは自分でデプロイ(deploy)つまりは配置ひなければならず、ipaexgで検索してipaフォントサイトよりダウンロードする必要があります。ipaフォントはダサダサですので、できればシステムフォントのヒラギノ角ゴProを使い所です。しかしコチラのシステムフォントを使うための詳細は明かされておらず、簡単に使うことはできないです。 でも、iPadの日本語システムフォントのfullpathは /System/Library/Fonts/LanguageSupport/HiraginoSans-W3.ttc あるいは HiraginoSans-W6.ttc もしくはLanguageSupportではなく、 /System/Library/Fonts/CoreAddition、 /System/Library/Fonts/CoreUI、 /System/Library/Fonts/Core と、いうようなパス名になっていると思うので、そういったフォントも使えるかもしれない。確かめろや!なるほどなるほど。また今度っすね。 言語設定によって優先して利用されるフォントが変わるような仕組みになっているそうなので、間違って中国語フォントが出てこなければ良いですね。え、まだ使えるとも確証がないのに? ちなみに自分はpythonの勉強はWindows PCのVisualStudioですることにしたので、もうpythonista3は使いたくないです。制約が多すぎてイライラする。matplotlibを使う開発では使わないことにしました。windowsの方がまだましです。pythonista3だとグリッドも隠れないし。不具合だらけな感じ。 === '''1行目から10行目は''' === 各種ライブラリを読み込む命令でfromの後ろの文字列がライブラリから一部を読み込むことを宣言していてimportの後ろの部分の文字列のライブラリを読み込みます。つまりimportの後ろに来る文字列が読み込むライブラリ名でfromをおおもとのもっと大きなライブラリ名。それでasの後ろにくる文字列はエイリアスとも言いますが、読み込むライブラリに対して代わりの名前を命名することができます。ライブラリ名が長い場合にはasの後ろに文字列を任意でつけて使います。一部だけを読み込んだときも親のライブラリ名を省いて利用できるので、エイリアスを付けたのと同じような効果があります。 matplotlibがプロット機能のライブラリの大きなライブラリとなっています。 :*matplotlib グラフ機能全体 ::*matplotlib.rcParams レイアウト全般のパラメータ ::*matplotlib.pyplot プロットグラフ ::*matplotlib.ticker グラフの目盛り ::*matplotlib.font_magager グラフのフォント pylabはmatplotlib向けのインターフェースでいろいろなことができて便利だが、読み込みは非推奨らしい。このサンプルでも読み込んではいるものの、pylabにぶら下がっている便利なモジュール群は使ってない。pylabの利用によって、複雑なプログラムほど、意図せず読み込んだ関数が多くなりやすく、思わぬ挙動をしてしまうことになると様々なプログラマが心配しています。 numpyは配列の数学的操作が出来たり、数学演算全般や定数を行うことができるモジュールです。演算を行うことが主となるプログラミングの世界では、よく使うモジュールです。 mathはnumpyと同じようなものですが、数学処理に特化した関数を提供します。ここではmath.eというネイピア数を返す定数用に呼び出しましたが、numpy.eもあります。簡単に違いを述べるとnumpyは数学関数の引数に配列を受け取ることができて、一括の計算ができる便利な機能が豊富でmathは配列ではない変数を受け取る簡単な関数になっていますが、同じ関数がある場合mathの方が演算が早いので繰り返しの単純演算はmathやpython本体が持つ関数での演算が速度が速く向いているということになっています。 sysは環境変数やpythonそのものの状態やプログラムの実行状態の取得のような、まさにシステム関連の処理をするモジュールになっています。このプログラムでは使っていません。 === '''19行目''' === <syntaxhighlight lang="python"> ax = fig.add_subplot(1, 1, 1, zorder=0) </syntaxhighlight> グラフは四角形の中に挿入されるイメージでとらえてもらえれば、fig.add_subplotというのは納得しやすいと思います。でもなんでsubplot?と思うかもしれません。fig.add_plotじゃだめなの?って思ってしまうかもしれませんが、一つのfig(図形)の中にいくつもグラフを配置することが出来るからsubplotという小さな単位で追加するという概念になっています。1個しかグラフを置かない場合でもsubplotとして追加します。グラフを追加する関数の引数に、その挿入するグラフの位置を指定することになっています。1,1,1という引数は1行1列のグラフの1番目の位置という意味になります。add_subplotは追加していくので、もとのグラフがあった場合は上書きされていきます。 逆に下地のグラフを消して追加する場合は、plt.subplot(1,1,1, zorder=0)とします。では1行1列以外に配置するパターンを一応確認しましょう。そんなに沢山グラフを配置するかなってところまで、突き詰めてみます。 以下の例ではplt.subplot(1,1,1)→fig.add_subplot(3,3,1)→fig.add_subplot(3,3,9)とした場合です。 [[ファイル:Subplot pattern1.png| | |none|subplot_pattern1]] グラフ番号は左上隅から始まり、左から右へ横へ増えていき、右端までいったら次の行の左から右へと増えることを繰り返して、右下隅で終わります。このグラフ位置1,1,1などといった表記は全ての要素が1桁で表せる場合はカンマによる区切りを省略することが出来て、1,1,1,という表記を 111,という表記にすることも出来ます。 fig.add_subplot あるいは plt.subplots(x,x,x,sharex=True,sharey=True)のようにすると目盛りを複数のグラフで共有することになりグラフ全体の下端と左端の目盛りだけを使う設定になります。 セルの結合のように、複雑な結合のグラフを配置することも出来ます。plotを生成する最初のところで、 <syntaxhighlight lang="python"> fig = plt.figure() grid = plt.GridSpec(3, 3, wspace=0.3, hspace=0.3) </syntaxhighlight> のように設定して、3行3列のグラフとして定義した上で左上を起点に[縦,横]という関係において[0,0]~[2,2]の3行3列のグリッドを作ります。そして、 <syntaxhighlight lang="python"> ax1 = fig.add_subplot(grid[0, 0]) ax2 = fig.add_subplot(grid[0, 1:])#ax2を横に1と2を結合した ax3 = fig.add_subplot(grid[1:, 0])#ax3を縦に1と2を結合した。 ax4 = fig.add_subplot(grid[1, 1]) ax5 = fig.add_subplot(grid[1, 2]) ax6 = fig.add_subplot(grid[2, 1]) ax7 = fig.add_subplot(grid[2, 2]) </syntaxhighlight> [[ファイル:Subplot pattern2.png| | |none|subplot_pattern2]] と、このように複雑な結合を行うことが出来ます。1:の後ろの数字は終わりまでという意味で省略していますが、1:2と明記しても良いですし、ax5やax7を定義しないで、歯抜けのままにしても良いです。
Python matplotlibで学ぶ…グラフ描画プログラム
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ