matplotlibでグラフ作成

Python3のインストール

Python3は,brew install python3 で普通にインストール.Puyhon3.6.0がインストールされます.

あとは pip3 をアップグレードして,モジュール類を pip3 でインストールしています.

brew install python3  # Python3.6.0
pip3 install --upgrade setuptools
pip3 install --upgrade pip
brew linkapps
pip3 install numpy
pip3 install scipy
pip3 install matplotlib
pip3 install Pillow

通常のPythonでの使い方

コマンドラインで入力データファイルと出力画像ファイルを指定

import numpy as np
import matplotlib.pyplot as plt
import sys

# Parameter setting
param=sys.argv
fnameR=param[1]     # input filename
fnameF=param[2]     # output image file name

......

plt.savefig(fnameF,dpi=200, bbox_inches='tight', pad_inches=0.2)
plt.show()
plt.close()

Jupyter Notebookのインストール

ここ( http://jupyter.org/install.html )に従ってインストール. ただし,Python3, numpy, scipy, matplotlibは導入済みの環境です.

pip3 install --upgrade pip
pip3 install jupyter

これでインストールは完了.以下で起動できます.

jupyter notebook

起動すると,起動したディレクトリ内の,子ディレクトリとファイルが並んだ画面が現れます.

Jupyter Nootbookでグラグを表示

Jupyter notebookでグラフを表示するため,コードの先頭に以下を記載.

%matplotlib inline

でも毎回起動のたびに書き込むのはめんどう.そこで...

ここ(http://keisanbutsuriya.hateblo.jp/entry/2015/11/28/220429) に従い,以下を実行.

ipython profile create

これで~/.ipython/profile_defaultにipython_config.pyというファイルができるのでこれを開いて編集.

## lines of code to run at IPython startup.
#c.InteractiveShellApp.exec_lines = []
c.InteractiveShellApp.exec_lines = ['%matplotlib inline']

上記の部分3行目 c.InteractiveShellApp.exec_lines = ['%matplotlib inline'] を書き込む.

これで,毎回%matplotlib inlineを書き込まずにすむ.

とりあえずプロット

ここではnumpyでファイル'out_weir.txt'からデータを読み込む

まずは,x軸データをQQ,y軸をEL1およびEL2として,プロットしてみる

入力データは以下のような形式のものである.

      elv1       elv2          Q      h2/h1         x1         x2         x3
    63.000     60.290      0.000
    63.062     60.324      1.000    -43.461      0.062    -99.000    -99.000
    63.097     60.358      2.000    -27.262      0.097    -99.000    -99.000
    63.126     60.392      3.000    -20.684      0.126    -99.000    -99.000

    ......     ......      .....     ......     ......     ......     ......
In [1]:
import numpy as np
import matplotlib.pyplot as plt

def DINP(fnameR):
    data=np.loadtxt(fnameR,skiprows=1,usecols=(0,1,2))
    EL1=data[:,0]
    EL2=data[:,1]
    QQ=data[:,2]
    return EL1,EL2,QQ

fnameR='out_weir.txt'
EL1,EL2,QQ=DINP(fnameR)
# Plot
fig=plt.figure()
plt.plot(QQ,EL1,color='red',lw=2.0,label='Upstream WL')
plt.plot(QQ,EL2,color='blue',lw=2.0,label='Downstream WL')
Out[1]:
[<matplotlib.lines.Line2D at 0x105047588>]

グラフの見栄えを調整 (1)

  • グラフの大きさを指定: fig=plt.figure(figsize=(8,6))
  • 軸ラベル表示(xlabel, ylabel)
  • 軸範囲設定 (xlim, ylim)
  • 目盛り設定(xticks, yticks)
  • グリッド表示(grid)
  • 凡例表示(legend)
In [5]:
import numpy as np
import matplotlib.pyplot as plt

def DINP(fnameR):
    data=np.loadtxt(fnameR,skiprows=1,usecols=(0,1,2))
    EL1=data[:,0]
    EL2=data[:,1]
    QQ=data[:,2]
    return EL1,EL2,QQ

fnameR='out_weir.txt'
EL1,EL2,QQ=DINP(fnameR)

qmin=0.0;qmax=700.0;dq=100
emin=60.0;emax=68.0;de=1.0

fig=plt.figure(figsize=(8,6))
plt.plot(QQ,EL1,color='red',lw=2.0,label='Upstream WL')
plt.plot(QQ,EL2,color='blue',lw=2.0,label='Downstream WL')
plt.xlabel('Discharge (m$^3$/s)')
plt.ylabel('Elevation (EL.m)')
plt.xlim(qmin,qmax)
plt.ylim(emin,emax)

plt.xticks(np.arange(qmin,qmax+dq,dq))
plt.yticks(np.arange(emin,emax+de,de))

plt.grid()
plt.legend(shadow=True,loc='upper left',handlelength=3)
Out[5]:
<matplotlib.legend.Legend at 0x10426f780>

グラフの見栄えを調整 (2)

軸目盛りをtickerを用いて描画

......
from matplotlib.ticker import *
......
ax = plt.gca()
ax.xaxis.set_major_locator(MultipleLocator(dq))
ax.xaxis.set_minor_locator(MultipleLocator(dq/10))
ax.yaxis.set_major_locator(MultipleLocator(de))
ax.yaxis.set_minor_locator(MultipleLocator(de/2))
In [4]:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import *

def DINP(fnameR):
    data=np.loadtxt(fnameR,skiprows=1,usecols=(0,1,2))
    EL1=data[:,0]
    EL2=data[:,1]
    QQ=data[:,2]
    return EL1,EL2,QQ

fnameR='out_weir.txt'
EL1,EL2,QQ=DINP(fnameR)

qmin=0.0;qmax=700.0;dq=100
emin=60.0;emax=68.0;de=1.0

fig=plt.figure(figsize=(8,6))
plt.plot(QQ,EL1,color='red',lw=2.0,label='Upstream WL')
plt.plot(QQ,EL2,color='blue',lw=2.0,label='Downstream WL')
plt.xlabel('Discharge (m$^3$/s)')
plt.ylabel('Elevation (EL.m)')
plt.xlim(qmin,qmax)
plt.ylim(emin,emax)

ax = plt.gca()
ax.xaxis.set_major_locator(MultipleLocator(dq))
ax.xaxis.set_minor_locator(MultipleLocator(dq/10))
ax.yaxis.set_major_locator(MultipleLocator(de))
ax.yaxis.set_minor_locator(MultipleLocator(de/2))

plt.grid()
plt.legend(shadow=True,loc='upper left',handlelength=3)
Out[4]:
<matplotlib.legend.Legend at 0x103f856a0>

情報の追加

In [5]:
import numpy as np
import matplotlib.pyplot as plt

def DINP(fnameR):
    data=np.loadtxt(fnameR,skiprows=1,usecols=(0,1,2))
    EL1=data[:,0]
    EL2=data[:,1]
    QQ=data[:,2]
    return EL1,EL2,QQ

fnameR='out_weir.txt'
EL1,EL2,QQ=DINP(fnameR)

qmin=0.0;qmax=700.0;dq=100
emin=60.0;emax=68.0;de=1.0

fig=plt.figure(figsize=(8,6))
plt.plot(QQ,EL1,color='red',lw=2.0,label='Upstream WL')
plt.plot(QQ,EL2,color='blue',lw=2.0,label='Downstream WL')
plt.xlabel('Discharge (m$^3$/s)')
plt.ylabel('Elevation (EL.m)')
plt.xlim(qmin,qmax)
plt.ylim(emin,emax)

plt.xticks(np.arange(qmin,qmax+dq,dq))
plt.yticks(np.arange(emin,emax+de,de))

plt.grid()
plt.legend(shadow=True,loc='upper left',handlelength=3)

QQ1=87
for i in range(0,len(EL1)):
    if QQ[i]==QQ1: break
elv1=EL1[i]; s1='EL'+'{0:.1f}'.format(elv1); s2='Q='+'{0:.0f}m$^3$/s'.format(QQ1)
plt.plot([0,QQ1],[elv1,elv1],color='black',lw=1)
plt.plot([QQ1,QQ1],[emin,elv1],color='black',lw=1)
plt.text(QQ1,elv1,s1, ha='right', va='bottom', fontsize=9)
plt.text(QQ1+5,61,s2, ha='left', va='bottom', rotation=90, fontsize=9)

QQ1=290
for i in range(0,len(EL1)):
    if QQ[i]==QQ1: break
elv1=EL1[i]; s1='EL'+'{0:.1f}'.format(elv1); s2='Q='+'{0:.0f}m$^3$/s'.format(QQ1)
plt.plot([0,QQ1],[elv1,elv1],color='black',lw=1)
plt.plot([QQ1,QQ1],[emin,elv1],color='black',lw=1)
plt.text(QQ1,elv1,s1, ha='right', va='bottom', fontsize=9)
plt.text(QQ1+5,61,s2, ha='left', va='bottom', rotation=90, fontsize=9)

QQ1=580
for i in range(0,len(EL1)):
    if QQ[i]==QQ1: break
elv1=EL1[i]; s1='EL'+'{0:.1f}'.format(elv1); s2='Q='+'{0:.0f}m$^3$/s'.format(QQ1)
plt.plot([0,QQ1],[elv1,elv1],color='black',lw=1)
plt.plot([QQ1,QQ1],[emin,elv1],color='black',lw=1)
plt.text(QQ1,elv1,s1, ha='right', va='bottom', fontsize=9)
plt.text(QQ1+5,61,s2, ha='left', va='bottom', rotation=90, fontsize=9)

plt.hlines([60.3],qmin,qmax,linestyle='solid')
plt.hlines([63.0],qmin,qmax,linestyle='dashed')
plt.text(0.5*(qmin+qmax),63.0,'EL.63.0 (Top of weir, B=50m)', ha='center', va='bottom')
plt.text(0.5*(qmin+qmax),60.3,'EL.60.3 (Bottom of river)', ha='center', va='bottom')
Out[5]:
<matplotlib.text.Text at 0x10d9cff98>
In [ ]: