画像取扱ではまったことなど（matplotlibとTeXに関連して）


# はじめに
最近仕事の設計計算で使っている Python のバージョンを何の気なしに 3.6 から 3.7 に上げたのですが，いくつかつまずいたので，メモしておきます．この内容は，新しいマシンへのインストールや OS クリーンインストール時も，参考になるかもしれません．（それほど高度なことではありませんし，Anaconda とかを使っている人には無縁のことかもしれませんが，備忘録です．）

なお，文書とコマンドだけではつまらない（と思う）ので，おまけとして作成した図の紹介もしています．


# 環境
MacBook Pro (Retina, 13-inch, Mid 2014)
macOS High Sierra


# 登場するソフトウェア

```
Python3.7.0 (numpy, scipy, matplotlib, pandas含む)  数値計算，データ処理，２次元グラフ作成
GMT 5.4.4                                           ３次元グラフ作成
ImageMagick 7.0.8                                   画像変換
BasicTex 2018                                       報告書作成
```

# Python3.7 と関連ライブラリのインストール
Homebrew で brew update してみたら python がマークされていたので迷わず brew upgrade ．
そしたら Python のバージョンが 3.6 から 3.7 になっていました．これにより今まで使っていた jupyter notebook やら numpy やら matplotlib やらが動きません．

そこで Python 関係のライブラリ類を pip3 にて再インストール．

```
pip3 install numpy
pip3 install scipy
pip3 install matplotlib
pip3 install pandas
pip3 install sympy
pip3 install jupyter
```

上記のインストールは，コンソールから普通に行えばいいのですが，以下の事項に注意する必要があります．

(1) pillow がないと matplotlib で jpg 出力できない．
matplotlib で jpg 画像を出力したいなら，以下の実行を忘れずに．

```
pip3 install pillow
```

(2) xlrd がないと pandas でエクセルファイルを読み込めない．
pandas でエクセルデータを読み込みたいなら以下の実行を忘れずに．

```
pip3 install xlrd
```


# 仕事の流れと問題点の発覚
大きな流れは，「jupyter 上で Python により各種計算・作図を行い，TeX 文書に書き込み，pdf 出力する」というもの．以下に説明を記載します．

まず，jupyter notebook 上で Python により設計計算を実施し，グラフや説明図を作成します．

設計計算は手持ちの立体骨組構造解析プログラムを使っています．
骨組構造の場合，節点番号や座標値が連続的に変わるので，もとの入力データはエクセルで作成するほうがやりやすいです．エクセルで作成したデータを Python で読み出し（pandas を利用），若干の加工を加えて解析用データファイルとしてテキストで書き出します．
なお，当初この段階で pandas は入れたのですが xlrd を入れ忘れており，エラーを吐かれました．あわてて xlrd をインストールして作業再開．

設計計算では，構造モデルや荷重の位置を変えながら 180 ケースほどの計算をこなすので，入力データの加工や入出力ファイルの名前付けなどは，プログラムを作り計算機で機械的に粉って行ったほうが間違いがないし，間違ったとしても簡単に修正できるので便利です．

３次元グラフは GMT により作成しますが，GME は eps 出力しかできないので，これを ImageMagick で png に変換します．説明図類は matplotlib で作成し，png 画像出力します．TeX 文書に数値データや png 画像で統一した説明図・グラフを埋め込み，レポートを作成，pdf 出力します．
GMT (Generic Mapping Tools) で作成した eps 画像を png 画像に一括変換する ImageMagick コマンドは以下の通りです．

```
mogrify -trim -density 300 -bordercolor "#ffffff" -border 10x10 -format png *.eps
rm *.eps
```

TeX 文書の構成は以下の通り．英語用なので文書クラスは article です．

```
\documentclass[10pt]{article}
\usepackage[a4paper,top=25mm,bottom=20mm,left=25mm,right=25mm]{geometry}
\usepackage[T1]{fontenc}
\usepackage{newtxtext,newtxmath}
\usepackage{bm}
\usepackage{float}
\usepackage{fancyvrb}
\usepackage[titletoc,title]{appendix}
\usepackage[dvipdfmx]{graphics,graphicx}
\begin{document}
......（内容）......
\end{document}
```

TeX 文書の pdf 化は以下のコマンドで実施（文書名を test.tex と仮定）．

```
platex test
dvipdfmx test
```

ここで問題が発覚．ノーエラーで dvi ファイル・pdf ファイルとも作成されるのですが，pdf の中身を確認してみると，png 画像の部分が一部白いままで画像が埋め込まれていない！
この現象は google 検索でもヒットし，TeX 文書のプレアンブルに，

```
\usepackage{color}
```

をいれると解決できるなどの対策も紹介されているのでやってみましたが，白抜きとなる部分が多少減っただけで解決できず．

そこで，画像をすべて jpg に変換して使ってみました．png 画像を jpg 画像に一括変換する ImageMagick コマンドは以下の通りです．

```
mogrify -format jpg *.png
rm *.png
```

matplotlib で作成している図面は，直接 jpg で保存しようとしましたがエラー．「jpg はサポートしていないよ」と言われてしまいました．これは，前述のとおり，pillow をインストールすることで解決できます．

全画像を jpg にしたことにより，全ての画像を pdf に埋め込むことに成功です．dvipdfmx で，dvi を pdf 化するスピードも，jpg のほうが png より早い印象でした．全画像 jpg 化でうまく行ったので試していませんが，画像を pdf 化して用いる方が良いとの意見もあるようです．


# （おまけ）作成した図の紹介
## Power Point で作成した説明図
いわゆるポンチ絵．手動（トラックパッド操作）で作っているので，かなり粗っぽい図ですが，縮小するとそれなりに見えます．

![crane_load.jpg](https://qiita-image-store.s3.amazonaws.com/0/129300/128cea38-ceeb-47b2-4c1c-68c58c7d8181.jpeg)

## matplotlib で作成した説明図
２次元の図なら，だいたいのことは matplotlib で思い通りにできます．

![fig_3d_model_u.jpg](https://qiita-image-store.s3.amazonaws.com/0/129300/e573e6d8-891f-e365-99bf-9e6ebfff3fda.jpeg)

## GMT で作成した３次元グラフ
３次元の図は自分としては GMT に限るという感じです．この手の図作成のポイントは，３次元方向に等スケールにすることなのですが，matplotlib ではやり方がわからない．matplotlib で同じような図が作れればいいのですけどね．

![fig_cu_mom1.jpg](https://qiita-image-store.s3.amazonaws.com/0/129300/362eb708-2b73-e7f2-0c04-9463ab797c25.jpeg)
![fig_cu_mom2.jpg](https://qiita-image-store.s3.amazonaws.com/0/129300/6344a3d6-fdff-d5e1-1129-0196f43069ae.jpeg)


# まとめ
+ matplotlib で jpg を使いたいなら，matplotlib とセットで pillow をインストールする．
+ pandas でエクセルデータを読み込みたいなら，pandas とセットで xlrd をインストールする．
+ LaTeX において，graphicx，platex，dvipdfmx で pdf を作りたいなら，png 画像より jpg 画像を用いるほうが信頼性が高く pdf 化スピードも早い．
+ ２次元の図は，matplotlib でこと足りる．ただし塗りつぶしが多い処理はとても遅いので注意．
+ ３次元の図は，現状 GMT が最高．matplotlib の３次元グラフは作り方がよくわからないし，作例をみてもどうも好きになれない．
+ いわゆるポンチ絵を作る場合，Power Point がお手軽でよい．以外に使えるかも．

以　上