101 lines
7.9 KiB
Org Mode
101 lines
7.9 KiB
Org Mode
#+TITLE: xls2ternary.py
|
|
#+AUTHOR: 大窪 貴洋 (千葉大院工) ohkubo.takahiro@faculty.chiba-u.jp
|
|
#+LANGUAGE: ja
|
|
#+EMAIL: ohkubo.takahiro@faculty.chiba-u.jp
|
|
#+OPTIONS: toc:2 num:nil author:t creator:nil LaTeX:nil \n:nil ^:{}
|
|
#+SETUPFILE: https://amorphous.tf.chiba-u.jp/org-html-themes/org/theme-readtheorg.setup
|
|
#+MACRO: color @@html:<font color="$1">$2</font>@@
|
|
#+MACRO: kakomi @@html:<div style="margin: 1em auto; padding: 1em; width: 100%; border: 2px dotted #ff0000;background-color: #ff;border-radius: 1px">$1</div>@@
|
|
|
|
|
|
* 更新履歴
|
|
- pandasを使うようにした。<2024-09-20 金>
|
|
|
|
* はじめに
|
|
Excelファイルから三成分系の相図をプロットするプログラムです。3成分系でガラス化範囲をプロットするために作成しました。いくつか3元プロットのライブラリが公開([[https://github.com/marcharper/python-ternary][python-ternary]] や[[http://home.gna.org/veusz/examples/#ternary][ Veusz]] )されているようですが、どれもイマイチ融通が効かないため、結局自作しました。
|
|
|
|
3成分の組成とガラス化の有無(0から1で判定)のデータから、相図を作成しコンタープロットを描きます。excelでファイルを作成し、引数でプログラムに渡します。3組成のそれぞれの成分名は、ファイル中のヘッダで指定します。入力するexcelファイルは、([[file:test.xlsx][test.xlsx]])を参考にしてください。3行目がヘッダデータ、3組成の成分比とガラス化の有無G/C(0から1の範囲)を列としたデータを作成します。
|
|
|
|
成分名については、latex形式で上付き下付きも指定できます。以下はB_{2}O_{3}の例です。
|
|
#+BEGIN_EXAMPLE
|
|
${\rm B_{2}O_{3}}$
|
|
#+END_EXAMPLE
|
|
|
|
※G/Cの列が空欄の場合、データはスキップされプロットされません。
|
|
|
|
* プログラムのインストール
|
|
プログラムはpython3.xで作成しているのでpython3.xを実行できる環境が必要です。matplotlibは2.0.2です。プログラム本体は[[file:xls2ternary.py][xls2ternary.py]]です。
|
|
python3.xを[[https://docs.anaconda.com/miniconda/][miniconda]]を使ってインストールしてください。numpy, matplotlib, pandasに加えてExcelファイルを読み込むためのopenpyxlが必要です。minicondaのインストールが完了したら以下のコマンドで必要なライブラリをインストールしてください。
|
|
#+BEGIN_EXAMPLE
|
|
conda install numpy matplotlib pandas openpyxl
|
|
#+END_EXAMPLE
|
|
後は、パスの通ったところに [[file:xls2ternary.py][xls2ternary.py]] を配置すればインストールは完了です。
|
|
|
|
* プログラムの実行
|
|
引数でexcelファイルを指定して実行します。テストデータ([[file:test.xlsx][test.xlsx]])を試しにプロットしてみます。
|
|
#+BEGIN_EXAMPLE
|
|
xls2ternary.py test.xlsx
|
|
#+END_EXAMPLE
|
|
次のような内容がターミナルに表示され、mol%で表示された図が得られれば正しくプログラムは動いています。
|
|
#+BEGIN_EXAMPLE
|
|
Number of data : 59
|
|
Plot header [row]: ['A' 'B' 'C'] [1, 2, 3]
|
|
G/C data [row]: G/C [4]
|
|
#+END_EXAMPLE
|
|
|
|
#+CAPTION: 出力される図
|
|
#+ATTR_HTML: :alt figure :title titiel mame :align center
|
|
#+ATTR_HTML: :width 440px
|
|
[[file:a.png][file:a.png]]
|
|
|
|
|
|
|
|
1列目のデータ範囲の最小値を指定できます。1列目のデータを70-100%にする場合です。また、コンタープロットの補完をlinearにしてラベルをwt%にしてみます。
|
|
#+BEGIN_EXAMPLE
|
|
xls2ternary.py -xmin 70 --interp linear -xl wt% test.xlsx
|
|
#+END_EXAMPLE
|
|
|
|
#+CAPTION: 1列目のデータを70から100%に拡大した図
|
|
#+ATTR_HTML: :alt figure :title titiel mame :align center
|
|
#+ATTR_HTML: :width 450px
|
|
[[file:b.png][file:b.png]]
|
|
|
|
図をファイルとして保存したい場合は、画面のメニューから選んでも良いですが、-oで保存もできます。またexcelファイル中のヘッダーの行番号やデータの列番号をオプションで指定できます。
|
|
-hで指定できるオプション一覧が表示されます。以下、オプションについてもう少し説明します。
|
|
|
|
|---------------+------------------------------------------------------------------------------------+---------|
|
|
| オプション | 内容 | default |
|
|
|---------------+------------------------------------------------------------------------------------+---------|
|
|
| -h | ヘルプを表します。 | |
|
|
|---------------+------------------------------------------------------------------------------------+---------|
|
|
| -si | xlsファイル中のシート番号(0からはじまる)を指定します。 | 0 |
|
|
| -hl | xlsファイル中のヘッダが入っている行番号を指定します。 | 3 |
|
|
| -m | 組成データを含む3つの列番号を指定します。 | 1 2 3 |
|
|
| -p | ガラス率(0から1の範囲)のデータを含む列を指定します。 | 4 |
|
|
| -xmin | 1列目のデータをxminから100の範囲に変更します。 | 0 |
|
|
|---------------+------------------------------------------------------------------------------------+---------|
|
|
| -o | 図を保存するファイル名前指定します。拡張子(pdfやpng等)で保存形式を自動判別します。 | None |
|
|
| -xl | 図の下のラベルを指定します。 | mol% |
|
|
| -g | コンタープロットのために内挿するグリッドの数です。 | 400 |
|
|
| -fs | 保存する図の大きさです。 | 8 |
|
|
| -ls | 頂点のラベルのフォントの大きさです。 | 16 |
|
|
| -ts | 目盛の数字のフォントの大きさです。 | 12 |
|
|
| --labeloffset | 頂点のラベルの位置のオフセット位置です。 | 2 |
|
|
| --tickoffset | 目盛の数字の位置のオフセット位置です。 | 1 |
|
|
| --colormap | コンタープロットのカラーマップです。[[https://matplotlib.org/examples/color/colormaps_reference.html][ここ]] から好きなものを選べます。 | bwr |
|
|
| --interp | コンタープロットする時の補完の方法です。[linear, cubic, nearest]から[[https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.interpolate.griddata.html][選択]] 。 | linear |
|
|
| --nolegend | 凡例を表示しません。 | |
|
|
| --nocontour | コンタープロットを表示しません。 | |
|
|
| --nocolorbar | カラーバーを表示しません。 | |
|
|
|---------------+------------------------------------------------------------------------------------+---------|
|
|
|
|
|
|
* 座標ピックアップ
|
|
表示された図中でマウスのボタン(左、中、右どれでも)をクリックすれば、3
|
|
成分の割合が以下のようにターミナルに表示されます。
|
|
#+BEGIN_EXAMPLE
|
|
button=1 ['B' 'C' 'A']=(24.52 51.03 24.45)
|
|
button=1 ['B' 'C' 'A']=(24.49 44.60 30.91)
|
|
button=1 ['B' 'C' 'A']=(45.65 26.83 27.53)
|
|
#+END_EXAMPLE
|