LoginSignup
0
0

More than 1 year has passed since last update.

【Python】matplotlibでAbaqusのカラーバーを簡単に作れるようにした

Posted at

はじめに

汎用有限要素法ソフトのAbaqusの結果表示では、凡例のカラーバーが表示されるのですが、小さく見にくいという問題があります。
そこでPythonのmatplotlibを使用して単体で画像を作成できるようにしました。
colorbar.png

背景

Abaqusの結果を表示するときにそれぞれの要素の値をカラーバーとして一緒に表示することがあります。

例えばこちらのシェル円筒の3点曲げ解析結果を表示させると

このようにカラーバー(凡例)をが小さすぎて非常に見づらくて発表には使用できません。
test.png

ビューポート内でこのようにうまく拡大縮小すれば何とか作成することはできますが、かなりめんどくさく、そして位置を変えたりすることができません。
test2.png

そこで、このようにAbaqusのカラーバー単体で画像を作成できるようにしました。
colorbar.png

プログラム

#値の最大最小
max_num = 8.355e+1
min_num = 1.664e-3

この部分に、カラーバーの一番上と下に書かれている数値を描いて実行するだけでカラーバーが作成されて保存されます。

make_abaqus_colorbar.py
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.colors import ListedColormap, BoundaryNorm
import numpy as np

#plt.rcParams["font.size"] = 10
#plt.rcParams['font.family'] = 'Times New Roman' # font familyの設定

# 解像度・グラフ形状
fig = plt.figure(dpi=300, figsize=(4,4))
ax = fig.add_subplot(1,10,1)



#色
cmap = ListedColormap(['#0000FF','#005CFF','#00B9FF','#00FFE7','#00FF8B','#00FF2E','#2EFF00','#8BFF00','#E7FF00','#FFB900','#FF5C00','#FF0000'])

#値の最大最小
max_num = 8.355e+1
min_num = 1.664e-3

bounds = np.linspace(min_num, max_num, 13)
norm = BoundaryNorm(bounds,cmap.N)


#カラーバー作成
cbar = mpl.colorbar.ColorbarBase(
    ax=ax,
    cmap=cmap,
    norm=norm,
    orientation="vertical",#縦長のカラーバー
    #ticklocation="right", #数値を右に表示
    ticks=bounds,
    format="%+.3e", #符号あり小数点以下3桁指数表記
    drawedges=True, #色の境界に線を引く
    #label="von Mises Stress", #ラベル
)


#cbar.minorticks_on() #カラーバーの小目盛り表示
cbar.minorticks_off() #カラーバーの小目盛り非表示


#表示
plt.show()
#保存
fig.savefig("colorbar.png", format="png", dpi=300,transparent=True)

使用する色

画像から抽出したところこのような16進数のカラーコードになっていました。
特に緑関連がとても似ていますね

#FF0000
#FF5C00
#FFB900
#E7FF00
#8BFF00
#2EFF00
#00FF2E
#00FF8B
#00FFE7
#00B9FF
#005CFF
#0000FF

サイズ・アスペクト比

サイズやアスペクト比は、この部分で決めています。

fig = plt.figure(dpi=300, figsize=(4,4))
ax = fig.add_subplot(1,10,1)

plt.show()するときは問題ないのですが、fig.savefigで保存するとなぜか文字が切れてしまうという問題があるので、fig.add_subplot(1,10,1)という部分で、右に9個空のグラフを作っています。

カラーバー作成

フォーマット指定子

今回、カラーバーに表示させている数字をformat="%+.3e"という部分で指定しています。
+が数字の前に符号をつけるフラグ
.3が小数点以下3桁の精度の指定
eが指数表記の修飾子
となっています。

詳しくはこちらを参考にしてください。

向き

ticklocation="right"の部分で、右側に数値を表示できます。
デフォルトでautoとなっており、右側に表示されるのでコメントアウトしていますが、明示的に右側にしたいときに使えます。
ちなみにleftと指定するとこうなります。

image.png

境界線

drawedges=Trueという部分で色と色の間に線を描いています。
Falseとするとこうなります。
image.png

ラベル

label="von Mises Stress"という部分でラベルを付けることができます。
ただ、向きがよくないので使用することはないと思います。

image.png

小目盛り

使用していると、たまに小目盛りが表示されてしまうことがあります。
そのため、cbar.minorticks_off()で明示的に表示しないようにしています。
cbar.minorticks_on()で表示するとこうなります。

image.png

その他の設定

こちらの公式リファレンスを読んでください

問題点

割り算をした際の有効数字と切り捨ての関係で、数字の最後の桁が1だけずれることがあります。
おそらくAbaqus上では浮動小数点の長い値から12分割して値を作成して表示しているのでしょうが、こちらはプログラムの都合上表示されている最大値と最小値から計算しているのでずれることがあります。
ただ、これが問題になるとはあまり思えないので、無視してもいいと思います。

もし「気になる」という方がいましたら、すべての数字のリストを作ればいいと思います。

おまけ:画像保存方法

念のため、ビューボート内の状態を背景を透過してpngで表示させる方法を説明します。

注釈

表示させる注釈を変更することができます。
上にあるタブの中の「ビューポート」から「ビューポート注釈オプション」を選び、
vlcsnap-2022-10-30-21h39m20s617 (2).png

出てきた「ビューポート注釈オプション」ウィンドウから表示させたいものを選びます。
image (1).jpg

対応がこちらとなっています。
なお、「テキストと矢印」についてはわからなかったので、知っている方がいらっしゃったら教えてください。
test(1).png

保存方法

上の方にあるプリンターマークを押し、
vlcsnap-2022-10-30-21h39m43s514 (2).png

「選択」ではコンパスを表示させたい人は3つ目のチェックボックスを入れ、それ以外の普通の人は触らなくていいです。
「設定」では、「出力先」は「ファイル」にし、「ファイル名」を決め、気になる方は「256色に減らす」のチェックを外します。
image.jpg

そうすることでこのような背景が透過したpng画像を保存できます。
test2.png

最後に

今回はAbaqusの凡例をPyhtonで作る方法について解説しました。
実はAbaqusはPython2.7で動いており、カラーバーの作成もおそらく内部でmatplotlibが使用されているのではと思っています。

完全再現とまではいきませんが、かなり近いものを高画質で作成できるようになったのではないでしょうか。

もし改善点、間違っている場所等ありましたら、コメントしてください。

参考サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0