Python matplotlibで学ぶ…グラフ描画プログラム 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(54行目~57行目)
(22行目/23行目)
 
1行: 1行:
 
== '''概要''' ==
 
== '''概要''' ==
 +
[[Python matplotlibを使って学ぶ統計処理 正規分布]]へ戻る
 +
 +
 
 pythonによるグラフ描画プログラムを以下に示します。
 
 pythonによるグラフ描画プログラムを以下に示します。
  
231行: 234行:
 
:::::[https://matplotlib.org/examples/color/named_colors.html https://matplotlib.org/examples/color/named_colors.html]
 
:::::[https://matplotlib.org/examples/color/named_colors.html https://matplotlib.org/examples/color/named_colors.html]
 
:::*16進数表記
 
:::*16進数表記
:::::'#xxxxxx'のxxに00~FFの値を適用してR(Red) G(Green) B(Blue)に対応し、すべての値が大きいほど白く、全ての値が小さいほど白くなる表記です。
+
:::::'#xxxxxx'のxxに00~FFの値を適用してR(Red) G(Green) B(Blue)に対応し、すべての値が大きいほど黒く、全ての値が小さいほど白くなる表記です。
 
:::*KRGB表記
 
:::*KRGB表記
 
::::[x.0,x.0,x.0,x.0]と配列にK白黒度合いを0~1.0の小数で指定します。RGBも同様です。
 
::::[x.0,x.0,x.0,x.0]と配列にK白黒度合いを0~1.0の小数で指定します。RGBも同様です。
242行: 245行:
 
*labelsize
 
*labelsize
 
::数値でラベルの大きさを設定します。主目盛りに対して表示される数字の大きさです。
 
::数値でラベルの大きさを設定します。主目盛りに対して表示される数字の大きさです。
 
  
 
=== '''26行目~29行目''' ===
 
=== '''26行目~29行目''' ===
380行: 382行:
 
:*arrowstyle
 
:*arrowstyle
 
::矢印のカタチをキーワードで指定します。左側がxytextで指定した座標側、右側がxyで指定した側の先端の矢印のカタチを意味するキーワードになっています。この設定値を使った場合、矢印の長さや矢印の大きさ幅はこのキーワードの中でhead_width=xx(=float), head_length=xx(=float)のように指定しなければ有効になりません。
 
::矢印のカタチをキーワードで指定します。左側がxytextで指定した座標側、右側がxyで指定した側の先端の矢印のカタチを意味するキーワードになっています。この設定値を使った場合、矢印の長さや矢印の大きさ幅はこのキーワードの中でhead_width=xx(=float), head_length=xx(=float)のように指定しなければ有効になりません。
 +
::*'-, …' 矢印そのものが無い普通の線
 
::*'wedge, …' 先端に矢印のカタチが無い尖った線 xy側が尖る
 
::*'wedge, …' 先端に矢印のカタチが無い尖った線 xy側が尖る
 
::*'simple, …' いたって普通の太目の矢印で塗り三角が付いたような矢印 xy側に矢印
 
::*'simple, …' いたって普通の太目の矢印で塗り三角が付いたような矢印 xy側に矢印
400行: 403行:
  
  
::*head_width
+
:::"|-"と"-|"も存在するんじゃないかと思ったのですが、説明書どおりで、ありませんでした。
:::矢印の横幅を数値で指定します。"]-[","-[","-[","|-|","wedge"には使えません。arrowstyleのリテラルの中で定義するモノです。arrowstyle='simple, head_width=0.5'のようにします。シングルクォーテーションの位置に注意してみて下さい。
+
 
 +
 
 +
:::*head_width
 +
::::矢印の横幅を数値で指定します。"]-[","-[","-[","|-|","wedge"には使えません。arrowstyleのリテラルの中で定義するモノです。arrowstyle='simple, head_width=0.5'のようにします。シングルクォーテーションの位置に注意してみて下さい。
 +
 
 +
 
 +
:::*head_length
 +
::::矢印部分の長さを数値で指定します。"]-[","-[","-[","|-|","wedge"には使えません。これもarrowstyleのリテラルの中で定義するモノです。arrowstyle='simple, head_width=0.5, head_length=0.5'のようにします。シングルクォーテーションの位置に注意して下さい。
 +
 
 +
 
 +
:::*tail_width
 +
::::矢印の線の始まりの部分の幅を数値で指定します。"fancy"と"simple"と"wedge"だけに適用できます。これもarrowstyleのリテラルの中で定義するモノです。arrowstyle='simple, head_width=0.5, head_length=0.5, tail_width=0.4'のようにします。シングルクォーテーションの位置に注意して下さい。
 +
 
 +
 
 +
:::*shrink_factor
 +
::::wedgeの矢印に膨らみや細り具合数値で指定します。0.0~0.5が細った状態で小さい値ほど細りが出ます。0.5より大きくなると膨らみが出ます。これもarrowstyleのリテラルの中で定義するモノです。
 +
 
 +
 
 +
 
 +
:::*widthA
 +
::::"|-|","]-[","]-"のxytext側(テキストがある側)のマークの幅を数値で指定します。これもarrowstyleのリテラルの中で定義するモノです。
 +
 
 +
 
 +
:::*widthB
 +
::::"|-|","]-[","-["のxy側(テキストが無い側)のマークの幅を数値で指定します。これもarrowstyleのリテラルの中で定義するモノです。
 +
 
 +
 
 +
:::*lengthA
 +
::::"|-|","]-[","]-"のxytext(テキストがある側)のマーク部の長さを数値で指定します。これもarrowstyleのリテラルの中で定義するモノです。
 +
 
 +
 
 +
:::*lengthB
 +
::::"|-|","]-[","-["のxytext(テキストが無い側)のマーク部の長さを数値で指定します。これもarrowstyleのリテラルの中で定義するモノです。
 +
 
 +
 
 +
:::*angleA
 +
:::*angleB
 +
::::"-["や"]-[","]-"において使えるオプションになっていますが、angleA・Bの両方とも謎の設定です。これもarrowstyleのリテラルの中で定義するモノとなっています。どういう変化が起こるはずなのか?わかったら記事を更新したいと思います。
 +
 
 +
※arrowstyleオプションを定義すると、annotateの引数のlw,linewidthやls,linestyle、width、headwidth、headlengthを使っても無視されます。なので、arrowstyleオプションを使うと線幅が指定できなくなると考えてよいと思います。
 +
 
 +
 
 +
::*width
 +
:::xyとxytextの座標が異なる場合の矢印の線の横幅を数値で指定します。linestyleが定義されていない場合に有効です。
 +
 
 +
 
 +
::*headwidth
 +
:::矢印の横幅を数値で指定します。linestyleが定義されていない場合に有効です。
 +
 
 +
 
 +
::*headlength
 +
:::矢印部の長さを数値で指定します。linestyleが定義されていない場合に有効です。
 +
 
 +
 
 +
::*shrink
 +
::xyとxytextの座標が異なる場合の矢印の線の長さを縮めさせる具合を数値で指定します。0.0~0.5の間で指定すると0.0は縮まない0.5は線がなくなるほどに縮む設定になります。0.5以降は座標同士の中心からxy側を終点とする矢印になり、0.5から1より小さい値に応じて、中心からの始点だったものがxy側に始点をずらしていくような効果があります。座標と座標の間ときっちり指定するのが普通なのでshrinkを使う場面は少なさそうですが、線の上に文字や図形がある場合に角度を変えずに手軽に長さを調整できますが、0.0から0.5の間の値でも両側が縮むので扱いにくい部分もあると思います。linestyleが定義されていない場合に有効です。
 +
 
 +
 
 +
ここまでの設定パラメータだけでは、simple以外の矢印で線の太さが設定できないことになります。もっと言えば、edgecolorの色を指定しなければ、線が表示されません。edgecolorを設定していれば、lwやlsと言ったパラメータによって線の太さや線の種類も設定できるようになります。複雑な書式になると一つのannotateだけでは難しい部分があるので、2つのannotateで矢印が無い線のと複雑な矢印設定とを同じ座標を持つ2つに対して設定するのがやりやすいと思います。
 +
 
 +
 
 +
::*facecolor
 +
:::矢印の塗り部分の色をカラー設定値で指定します。
 +
 
 +
::*edgecolor
 +
:::矢印の淵の線部分の色をカラー設定値で指定します。
 +
 
 +
 
 +
::*linewidth、lw
 +
:::edgeのライン幅を数値で指定します。
 +
 
 +
 
 +
::*linestyle、ls
 +
:::edgeのライン形式をラインスタイルのキーワード文字列で指定します。
 +
:::*'-' or 'solid' 実線
 +
:::*'--' or 'dashed' 破線
 +
:::*'-.' or 'dashdot' 1点鎖線
 +
:::*':' or 'dotted' 点線
 +
 
 +
 
 +
:arrowstyleはarrowprops同様に変数に格納して付与することが出来ます。
 +
<syntaxhighlight2 lang="python">
 +
from matplotlib.patches import ArrowStyle
 +
arrow_style = ArrowStyle('<|-|>', head_length=1, head_width=1)
 +
ax.annotate(s = '', xy = (0, 3.01), xytext = (0, -3.01), xycoords = 'data', arrowprops = dict( facecolor = 'black', arrowstyle = arrow_style, lw = 0.5, shrinkA = 0, shrinkB = 0))
 +
</syntaxhighlight2>
 +
:上記のようにarrowstyleに代入できます。このときの最初の引数には各種スタイルキーワードと遂になったキーワード文字列があります。
 +
::*'-'    = 'Curve'
 +
::*'simple'= 'Simple'
 +
::*'wedge' = 'Wedge'
 +
::*'fancy' = 'Fancy'
 +
::*'<|-|>' = 'CurveFilledAB'
 +
::*'<|-'  = 'CurveFilledA'
 +
::*'-|>'  = 'CurveFilledB'
 +
::*'<->'  = 'CurveAB'
 +
::*'<-'    = 'CurveA'
 +
::*'->'    = 'CurveB'
 +
::*']-['  = 'BracketAB'
 +
::*']-'    = 'BracketA'
 +
::*'-['    = 'BracketB'
 +
::*'|-|'  = 'BarAB'
 +
 
 +
:したがって、上記で示したプログラムのArrowStyle関数部分は
 +
<syntaxhighlight2 lang="python">
 +
arrow_style = ArrowStyle('CurveFilledAB', head_length=1, head_width=1)
 +
</syntaxhighlight2>
 +
:のように書くことも出来ます。
 +
 
 +
 
 +
::*ShrinkA
 +
::*ShrinkB
 +
:::Aはxytext側、Bはxy側の線を縮める量を数値で指定します。
 +
 
 +
 
 +
:annotateの設定は多種多様の設定があり、この項目だけでも、かなり長くなってきましたが、まだ線の2段の折り曲げやカーブの設定ができるangleとかarmの設定、テキストに囲みができる設定を紹介するので、もう少し長くなります(汗
 +
 
 +
 
 +
:*connectionstyle
 +
::矢印の線のつなぎ方をキーワードで指定します。接続の向きに関する設定や途中の折れ曲がる位置や曲点における設定はこのキーワードの中でangleA=xx(=float), angleB=xx(=float),rad=xのように指定しなければなりません。
 +
::*angle 主にL字のような線のつなぎ方をする。パラメータはxytext側の線の角度とxy側の角度と曲がるところのラウンド量
 +
::*angle3 滑らかなカーブを描くつなぎ方をする。パラメータはxytext側の線の角度とxy側の角度
 +
::*arc 2つの折り曲げ点をもつ線でのつなぎ方をする パラメータはxytext側の線の角度とxy側の角度と曲がるところのラウンド量と線の4分の1点の角度と4分の3点の角度
 +
::*arc3 弓状のつなぎ方をする。パラメータはxyからxytextという向きに対して左側に膨らむのがプラス、右側がマイナスとなる数値
 +
::*bar コの字のつなぎ方をする。パラメータはxyからxytextという向きに対して左側にコになるのがプラス、右側がマイナスとなる数値。とコの字を階段状にするパラメータ
 +
 
 +
::それぞれのパラメータ説明
 +
::*angle
 +
:::*angleA xytext側の角度を示す数値。xyが示す角度側に無い場合は、その反対の180度反転した方向になります。
 +
:::*angleB xy側の角度を示す数値。angleAの線が指定した角度の方向に無い場合はその反対の180度反転した方向になります。
 +
:::*rad xyから伸びた線とxytextから伸びた線の交わるところでのラウンド(丸まり)を数値で指定します。
 +
 
 +
 
 +
::*angle3
 +
:::*angleA xytext側の角度を示す数値。angleBで指定した角度に向かって曲線が描かれます。
 +
:::*angleB xy側の角度を示す数値。angleAで指定した角度に向かって曲線が描かれます。
 +
 
 +
 
 +
::*arc
 +
:::*angleA xytext側の角度を示す数値。xyが示す角度側に無い場合は、その反対の180度反転した方向になります。
 +
:::*angleB xy側の角度を示す数値。angleAの線が指定した角度の方向に無い場合はその反対の180度反転した方向になります。
 +
:::*armA xytext側と中心の半分の位置の角度を示す数値。armBが示す角度側に無い場合は、その反対の180度反転した方向になります。
 +
:::*armB xy側の中心の半分の位置の角度を示す数値。armAの線が指定した角度の方向に無い場合はその反対の180度反転した方向になります。
 +
:::*rad 線の曲がるところでのラウンド(丸まり)を数値で指定します。
 +
 
 +
 
 +
::*arc3
 +
:::*rad 弓状になる具合を数値で指定します。パラメータはxyからxytextという向きに対して左側に膨らむのがプラス、右側がマイナスとなる数値です。
 +
 
 +
 
 +
::*bar
 +
:::*fraction xytext側のコの字になる深さを数値で指定します。パラメータはxyからxytextという向きに対して左側に深くなるのがプラス、右側がマイナスとなる数値です。
 +
:::*angle 180と設定するとxyとxytextが斜めの位置関係にあれば、階段状の接続になります。仕組みとしては、コの字を描こうとするところのfractonで設定した値だけxytextで線を描いた後の折れ曲がるときの角度がここで設定している値で、ここからの長さは、90度、あるいは-90度に折れ曲がった線がxyが到達するところで、線が曲がって、ラインがxyに到達して、コの字あるいは階段型の線を形成します。コの字になるか階段状になるかは、xy側の線の長さを示す値と一致するようになっていて、xyとxytextの距離より長い場合や短い場合で切り替わります。方向はfractionで説明したとおりの向きに従います。
 +
 
 +
 
 +
:::以下にここまでで説明したとおりの形状変化がわかるようなサンプルを示します。
 +
 
 +
 [[ファイル:Subplot pattern4.png| | |none|subplot_pattern4]]
 +
 
 +
:::あら、一番右下の赤矢印がコの字なるはずが途切れちゃいました。プログラム動作時には見えていても、プログラムのグラフ図を保存する処理に任せると見切れちゃうみたいです。みなさんは気を付けてください。作り直せばいいじゃんと思いますが、自分のような、雑な人間は、こうなるという反面教師になるように、このままにしておきます。
 +
 
 +
 
 +
:*bbox
 +
::矢印の線のテキストの修飾を各種キーワードで指定します。テキストボックスの線の太さや塗りの色の設定といった更に細かい設定はこのキーワードの中でbbox=dict(boxstyle="キーワード", lw=xx(=float), ls=xx(=keyword),fc='#xxxxx')のように指定しなければなりません。
 +
 
 +
::boxstyleキーワード一覧
 +
::*circle 円
 +
::*darrow 両側矢印
 +
::*larrow 左矢印
 +
::*rarrow 右矢印
 +
::*round 丸角四角
 +
::*round4 丸角四角で、全体に膨らみあり
 +
::*roundtooth 波線
 +
::*sawtooth のこぎり線
 +
::*square 四角
 +
 
 +
 [[ファイル:Subplot pattern5.png| | |none|subplot_pattern5]]
 +
 
 +
::boxstyleに
 +
<syntaxhighlight2 lang="python">
 +
bbox = dict(boxstyle = "square, pad = 0.9")
 +
</syntaxhighlight2>
 +
 
 +
::というように文字列で付け足すキーワードでpad つまり四角の大きさが余白部分の大きさを元に設定できます。0.9が上記の状態です。
 +
 
 +
 
 +
::上記のようなキーワードには他にroundとround4で使えるrouding_size(丸みが強くなる)、さらにroundtoothとsawtooth(波やのこぎりが大きくなる)で使えるtooth_sizeがあります。
 +
 
 +
 
 +
::他にdict()の中で設定できるパラメータがあり、mutation_scaleで余白の拡大ができます。拡大だけでなく、文字が入らなくなるえげつない設定も可能です。mutation_aspect = 0.5 のようにして縦と横の比率を変化させようとするものもあります。
 +
 
 +
 
 +
::設定を一覧していきましょう。
 +
::*facecolor 塗りの色をカラー設定値で指定します。
 +
::*edgecolor 塗りの淵の色をカラー設定値で指定します。
 +
::*color 文字の色をカラー設定値で指定します。
 +
::*linewidth 塗りの淵の線の太さを数値で指定します。
 +
 
 +
::*linestyle 線のスタイルを線スタイルキーワードで指定します。
 +
:::*'-' or 'solid' 実線
 +
:::*'--' or 'dashed' 破線
 +
:::*'-.' or 'dashdot' 1点鎖線
 +
:::*':' or 'dotted' 点線
 +
 
 +
::*hatch 塗りのスタイルを塗りスタイルキーワードで指定します。
 +
:::*'/' 右上がり斜線 ///のように増やしていくと間隔が狭くなります。
 +
:::*'\' 左上がり斜線
 +
:::*'|' 縦線
 +
:::*'-' 横線
 +
:::*'+' クロス
 +
:::*'x' 斜めクロス
 +
:::*'o' 丸中模様
 +
:::*'O' 丸大大模様
 +
:::*'.' 点模様
 +
:::*'*' 星模様
 +
::::※いずれのパターンも**********連続して記述するほと間隔が狭くなります。9連くらいまでは効果があります。
 +
 
 +
::*alpha 塗りの透明度を数値で指定します。
 +
 
 +
といった感じですね。
 +
 
 +
 
 +
=== '''60行目''' ===
 +
<syntaxhighlight2 lang="python">
 +
ax.set_axisbelow(True)
 +
</syntaxhighlight2>
 +
 
 +
axisbelow(True)で軸やグリッドをプロットの後ろに隠してくれます。
 +
 
 +
 
 +
=== '''63行目''' ===
 +
<syntaxhighlight2 lang="python">
 +
ax.grid(True, zorder=-1)
 +
</syntaxhighlight2>
 +
グリッド線の表示を有効化しています。
 +
 
 +
 
 +
=== '''66行目''' ===
 +
<syntaxhighlight2 lang="python">
 +
ax.set_position([0.2, 0.2, 0.7, 0.6])
 +
</syntaxhighlight2>
 +
グラフの枠の位置を設定しています。引数には4要素の配列を指定します。[枠の左辺, 枠の下辺, 枠の横幅, 枠の高さ]のようにします。
 +
 
 +
 
 +
=== '''69行目~71行目''' ===
 +
<syntaxhighlight2 lang="python">
 +
ax.set_xlabel('x [-]', fontsize = 6, fontdict={'family': 'Meiryo'})
 +
</syntaxhighlight2>
 +
グラフの各種ラベルの文字の設定をします。
 +
:*set_xlabel x軸の下のラベル
 +
:*set_ylabel y軸の横のラベル
 +
:*set_title グラフの上のタイトルのラベル
 +
:それぞれの関数の引数で書式の設定ができます。
 +
::*第一引数の文字列で表示した文字を入力します。日本語を設定する場合は、fontdictや随分手前で紹介したfontpropertiesで日本語フォントファミリーを設定する必要があります。
 +
::*fontsize 文字の大きさを数値で設定します。
 +
::*fontdict フォントの設定を連想配列で['family':'Meiryo',…]とすることでMeiryoフォントを指定できます。フォント指定をするfamilyキーの他にfontweightで文字の太字設定やsizeあるいはfontsizeで文字の大きさcolorで色の設定ができます。"fontproperties"キーへの値でフォント設定をだいぶ前で説明したfont_managerオブジェクトの変数を値にしたような設定も出来ます。
 +
 
 +
 
 +
=== '''74行目~91行目''' ===
 +
いよいよプロット部分の説明です。ここでプロットして連続する値としてプロット値を実線でつなぐグラフを描画しています。ここではsigmaを可変できるようにされていて76行目 while文をつかっています。実際のプログラムではsigma = 1で始まって、判定式はsigma < 2で終了なのでsigmaが1のときの1回の処理になっています。whileの繰り返し範囲はpythonの制御構造ではインデントがそろっている範囲が繰り返し範囲になります。xの連続する値の配列に対してyの配列を生成するのが81行目の以下の部分です。
 +
<syntaxhighlight2 lang="python">
 +
y = 1 / (np.sqrt(2 * np.pi) * sigma) * np.power(math.e ,-1 / (2 * np.power(sigma, 2))  * np.power((x - u), 2))
 +
</syntaxhighlight2>
 +
xとyの配列の大きさは同じで、上記の式で一括してすべてのx配列値に対する結果がyの配列として生成されます。
 +
 
 +
 
 +
そして以下のような87行目でプロット処理がされます。
 +
<syntaxhighlight2 lang="python">
 +
ax.plot(x, y, linestyle='solid', linewidth = 0.8, zorder = 15 + sigma)
 +
</syntaxhighlight2>
 +
上記ではlinestyleは実線、linewidthは0.8と定義されています。
 +
 
 +
 
 +
ここまでの各種関数の全てに言えますが、zorder=整数値で重なりを制御できます。このように設定していれば、繰り返すたびにzorder値が大きくなるため上からかぶさるように描画されます。
 +
 
 +
 
 +
84行目でグラフプロットとしては少し複雑な処理を入れています。y軸と関数とが囲む領域に斜線のハッチング(線塗り)がされるように設定しています。
 +
<syntaxhighlight2 lang="python">
 +
plt.fill_between(x, y, facecolor="none", alpha=0.8, edgecolor='#1f77b4', hatch="//////", zorder = 15)
 +
</syntaxhighlight2>
 +
 
 +
 
 +
pltのfill_between関数でxとyのプロット値とy軸の間を塗る場合は、最初の2つの引数で x, y を与えます。以降は塗りに関する設定です。これまでにも使われたようなキーワードですので、理解はしやすいと思いますので、説明は省略します。
 +
 
 +
 
 +
これでグラフを描くことができました。
 +
 
 +
 
 +
=== '''94行目''' ===
 +
<syntaxhighlight2 lang="python">
 +
plt.show()
 +
</syntaxhighlight2>
 +
 
 +
上記の命令で標準出力にたいして、これまでの描画処理結果をディスプレイに表示することが出来ます。
 +
 
  
 +
plt.savefig("name.png", bbox_inches = 'tight', pad_inches = 0)
  
::*head_length
 
:::矢印部分の長さを数値で指定します。"]-[","-[","-[","|-|","wedge"には使えません。これもarrowstyleのリテラルの中で定義するモノです。arrowstyle='simple, head_width=0.5, head_length=0.5'のようにします。シングルクォーテーションの位置に注意して下さい。
 
  
 +
ちなみに上記のようにすると、png形式画像として出力できます。
  
::*tail_width
 
:::矢印の線の始まりの部分の幅を数値で指定します。"fancy"と"simple"だけに適用できます。これもarrowstyleのリテラルの中で定義するモノです。arrowstyle='simple, head_width=0.5, head_length=0.5, tail_width=0.4'のようにします。シングルクォーテーションの位置に注意して下さい。
 
  
※arrowstyleオプションを定義すると、lw,linewidthやls,linestyle、tail_width()
+
[[Python matplotlibを使って学ぶ統計処理 正規分布]]へ戻る

2020年9月18日 (金) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス