Pythonでコンター図を描いてみた Excelとの実力差は?

プログラミングの勉強

 

 今回はPython“matplotlib”を使ってコンター図を描いてみましたので、作成した簡単な作図プログラムを紹介します。Excelと比較すると圧倒的にPythonに軍配が上がる結果となりました。しかし、それでも利用の手軽さからExcelを使用したい場合には、コンター図を諦めて”条件付き書式”を利用するのが良さそうです。


pythonでコンター図を描く

 Excelでコンター図を作成してみる!その実力は?においてExcelで描いたものと同じ版の曲げモーメントを例題として、コンター図を作成しました。作成プログラムは次のような順番で構成されています。

  1. matplotlobnumpyのモジュール設定をします。
  2. コンターを描くx座標とy座標を設定し、変数域を表す配列XとYを作成します。
  3. x,yに対応する値をZに多次元リストとして入力します。
  4. コンター図の設定(カラーマップの設定、軸やグラフタイトル)を行います。
  5. 作図指示を行います。

 なお、matplotlibがインストールされていない場合には、インストールが必要です。windowsの場合は、つぎのコマンドでインストール出来ます。

pip install matplotlib

 さて、作成したプログラムを以下に示します。

#-------------- モジュールの設定 --------------------------
import matplotlib.pyplot as plt
import numpy as np

#-------------- インプットデータ入力 ----------------------
xx=np.linspace(0,15.0,5)
yy=np.linspace(0,10.0,5)
X,Y=np.meshgrid(xx,yy)
Z=[[0,-9,-12.6,-9,0],
   [-34.6,7.1,7.3,7.1,-34.6],
   [-57,13.3,15.8,13.3,-57],
   [-34.6,7.1,7.3,7.1,-34.6],
   [0,-9,-12.6,-9,0]]

#-------------- 作図の指定 --------------------------------
fig, ax=plt.subplots(constrained_layout=True,
                     subplot_kw=dict(aspect='equal'))

## コンターの分割について設定なし,カラーマップにjetを設定 ##
cs=ax.contourf(X,Y,Z,cmap='jet')

## 凡例(カラーバー)の設定 ##
cb=fig.colorbar(cs,shrink=0.7)

## 軸ラベルの設定 ##
ax.set_xlabel('x(m)',size=11)
ax.set_ylabel('y(m)',size=11)

## 図のタイトル設定 ##
ax.set_title(' Mx(kN)',size=15,loc='left') 
ax.set_title(f'Mxmax={np.amax(Z):.2f} , Mxmin={np.amin(Z):.2f}',size=12,loc='right')

#-------------- 作図の指示 --------------------------------
plt.show()

変数域の設定

 xy平面上にコンター図を作成するとき、xとyの変数域を定義します。つまり、x方向のプロット点座標とy方向のプロット点座標をそれぞれリストで定義します。上記の例では0~15を5分割、0~10を5分割してxxとyyのリストをそれぞれ作成しています。これをnp.meshgrid関数に渡すことで、2つの配列XとYを作成します。Xはxxを行としてyyの要素数だけ並べたものYはyyを列としてxxの要素数だけ並べたものです。

   X, Y=np.meshgrid(xy) 

ここで、x, yは1次元の座標配列を、X, Yは2次元上の格子点におけるX座標とY座標の配列を示します。

格子点の値を定義

 上記のプログラム例では、np.meshugridで設定した格子点に対応する値をZの多次元リストとして入力しています。Zの全体リストを構成する1つのリストはX座標に関して並べた値であり、このリストをY座標の順番に並べています。

コンター図の作図指示

 上記例では、plt.subplots関数でFigureAxesを定義しています。plt.subplotsの()内のconstrained_layout=Trueは配列の自動調整を、subplot_kw=dict(aspect=’equal’)は縦横の比率を合わすように指示しています。

 コンター図の設定はcontourfメソッドを用います。

  cs=ax.contourf(XYZ,cmap=’カラーマップ名‘)

X,Yはnp.meshugridで定義した格子点、Zはその格子点に対応する値を表します。

 コンターのカラーマップmatplotlibドキュメントカラーマップのページに示されているものを利用可能です。今回はこの中から”jet”を利用しました。

カラーバーの追加

 コンター図にカラーバーを表示するには、colorbarメソッドを使用します。

  cb=fig.colorbar(cs,shrink=0.7)

csはcontourfメソッドが返したオブジェクトを示し、shrink=0.7は隣接する軸との表示比率を0.7に調整しています。

pythonで描いたコンター図例

 前回Excelで描いた版の曲げモーメント分布と同じものをpythonで描いた結果です。

 配色は”jet”、それぞれ凡例を変えて描いています。

①10個の配色分割を指定した場合 → cs=ax.contourf(X,Y,Z,cmap=’jet’,levels=9)

 

②コンターの分割指定なしの場合 → cs=ax.contourf(X,Y,Z,cmap=’jet’)

 

③コンターの配色分割を数値で指定した場合

 → cs=ax.contourf(X,Y,Z,cmap=’jet’,levels=[-60,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10,-5,0,5,10,15,20])

 いかがでしょうか?市販の図化ソフトには及ばないものの、コンター図として十分利用できるレベルと言えそうです。

Excelとの比較とExcelの使用法

 コンター図に関しては、ExcelよりPythonの方が性能が高いと言えそうです。普段FEM解析等で使用している市販のポスト用ソフトのイメージに合っていますよね。ここでは、上記の例として示したものと同じ荷重条件で、データの密度を6倍に増やしたものでコンター図を描いて比較します。

 下図がpythonでコンターの色分けを分割値で入力して作図したものです。データ数が多い分だけ、なめらかなコンター図が描けています

 Excelで描いたものが下図です。分割線はなめらかになっているものの、やはり配色につながりが無いことと凡例が自分で操作できないため、コンター図としてデータを整理するには無理があります。

 下図がExcelに解析結果を貼り付けて条件付き書式で着色したものです。pythonでもコンター図に数値を表示することが出来ますが、数値を表として整理するにはExcelの方が優秀な気がします。Excelを利用して解析結果を整理する場合には、VBAでデータを自動的に読み取り、表にデータを配列して条件付き書式を用いれば、省力化と視覚的な整理が出来そうですね。

両者とも手軽なツールとして利用 

 実際にExcelとpythonを比較した結果は以上ですが、結局、コンター図を作成するには市販のポスト用ソフトがやはり性能が高く、応用が利くように思われます。しかし、手軽にコンター図や解析結果を整理したい場合には、用途によって使い分けることでpythonやExcelも手軽なツールになりそうです。

 以上、参考になれば幸いです。

コメント

タイトルとURLをコピーしました