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

# はじめに

汎用有限要素法ソフトのAbaqusの結果表示では、凡例のカラーバーが表示されるのですが、小さく見にくいという問題があります。
そこでPythonのmatplotlibを使用して単体で画像を作成できるようにしました。
![colorbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/ce6f7a5f-d263-076a-d4cb-33847a95efb8.png)

# 背景

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

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

https://qiita.com/yuki_2020/items/4a90448f9685d2511675#%E7%B5%90%E6%9E%9C

このようにカラーバー（凡例）をが小さすぎて非常に見づらくて発表には使用できません。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/60ad5d74-24c9-6951-5412-337b14e200a1.png)

ビューポート内でこのようにうまく拡大縮小すれば何とか作成することはできますが、かなりめんどくさく、そして位置を変えたりすることができません。
![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/4b6f9d28-6da3-8bd0-08d3-eaf7bfe1d208.png)



そこで、このようにAbaqusのカラーバー単体で画像を作成できるようにしました。
![colorbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/ce6f7a5f-d263-076a-d4cb-33847a95efb8.png)




# プログラム



```python
#値の最大最小
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進数のカラーコードになっていました。
特に緑関連がとても似ていますね

<font color="#FF0000">#FF0000</font>
<font color="#FF5C00">#FF5C00</font>
<font color="#FFB900">#FFB900</font>
<font color="#E7FF00">#E7FF00</font>
<font color="#8BFF00">#8BFF00</font>
<font color="#2EFF00">#2EFF00</font>
<font color="#00FF2E">#00FF2E</font>
<font color="#00FF8B">#00FF8B</font>
<font color="#00FFE7">#00FFE7</font>
<font color="#00B9FF">#00B9FF</font>
<font color="#005CFF">#005CFF</font>
<font color="#0000FF">#0000FF</font>



## サイズ・アスペクト比

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

```python 
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`が指数表記の修飾子
となっています。

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

https://www.k-cube.co.jp/wakaba/server/format.html

https://webkaru.net/clang/printf-format-specifiers/



### 向き

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/b75e03f9-7ddb-f6fd-4463-353ee5d53718.png)




### 境界線

`drawedges=True`という部分で色と色の間に線を描いています。
`False`とするとこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/0502b8f0-8169-f3cd-8057-261a891d32e6.png)

### ラベル

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/2a1cabca-5720-6cc0-349f-2804e60f8356.png)



### 小目盛り

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/fa6e5a5c-74d6-5577-1858-db28ea7bee40.png)


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

https://bourbaki.biz/matplotlib-colorbarbase-document/



# 問題点

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

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






# おまけ：画像保存方法

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

## 注釈

表示させる注釈を変更することができます。
上にあるタブの中の「ビューポート」から「ビューポート注釈オプション」を選び、
![vlcsnap-2022-10-30-21h39m20s617 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/37ed8348-f54b-82b1-917d-f022943026ae.png)

出てきた「ビューポート注釈オプション」ウィンドウから表示させたいものを選びます。
![image (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/dccc8490-edcd-3ab9-c39b-0a7a6d517a6e.jpeg)



対応がこちらとなっています。
なお、「テキストと矢印」についてはわからなかったので、知っている方がいらっしゃったら教えてください。
![test(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/999bead1-e68c-5d5a-0c91-b2cc3bf29175.png)





## 保存方法

上の方にあるプリンターマークを押し、
![vlcsnap-2022-10-30-21h39m43s514 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/1a477708-3c2d-7950-91f3-d07ed3a3e4fb.png)

「選択」ではコンパスを表示させたい人は3つ目のチェックボックスを入れ、それ以外の普通の人は触らなくていいです。
「設定」では、「出力先」は「ファイル」にし、「ファイル名」を決め、気になる方は「256色に減らす」のチェックを外します。
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/2947ee6c-cbc3-b1d0-5e76-6cd2f4b64c3b.jpeg)

そうすることでこのような背景が透過したpng画像を保存できます。
![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/4b6f9d28-6da3-8bd0-08d3-eaf7bfe1d208.png)

# 最後に

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

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

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



# 参考サイト

https://hackmd.io/@h2tg95D2RP2ed-D8u-49Mg/S1moBqaRr

https://sabopy.com/py/matplotlib-55/

https://bourbaki.biz/matplotlib-colorbarbase-document/