1 minute read

matplotlibで作成したグラフを,tikzファイルに変換することができるtikzplotlibライブラリの使い方.pypiのページはこちら

インストール

インストールはpipまたはcondaで可能.

pip install tikzplotlib
conda install -c conda-forge tikzplotlib

使い方

使い方はとても簡単で,matplotlibで通常のコードを書いたあと,最後に以下の2行を追加するだけでtest.texにコードが出力される.

import tikzplotlib
tikzplotlib.save("test.tex")

例えば以下のような例が一例だ.ここではガウス関数をプロットするグラフを作成している.

def f(x,mu,sigma):
    '''
    プロットする関数.ここではガウシアンを例にとる.
    mu : 平均値
    sigma : 分散
    '''
    import numpy as np
    return np.exp(-(x-mu)**2/(2*sigma**2))

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8,5),tight_layout=True) # figure, axesオブジェクトを作成
x = np.linspace(-1,1,1000)
ax.plot(x,f(x,0,1)) #

# 各要素で設定したい文字列の取得
xlabel="x label"
ylabel="y label"

# 各要素の設定を行うsetコマンド
ax.set_xlabel(xlabel,fontsize=22)
ax.set_ylabel(ylabel,fontsize=22)

ax.grid()

ax.tick_params(axis='x', labelsize=20 )
ax.tick_params(axis='y', labelsize=20 )

lgnd=ax.legend(loc="upper left",fontsize=20)

ax.plot()
fig.savefig("test.pdf")

import tikzplotlib
tikzplotlib.save('test.tex')

このコードから生成されたtexファイルは以下のようになる.データ点が1000個並んでしまうのでそこは省いてある.

% This file was created with tikzplotlib v0.10.1.
\begin{tikzpicture}

\definecolor{darkgray176}{RGB}{176,176,176}
\definecolor{lightgray204}{RGB}{204,204,204}
\definecolor{steelblue31119180}{RGB}{31,119,180}

\begin{axis}[
legend style={
  fill opacity=0.8,
  draw opacity=1,
  text opacity=1,
  at={(0.03,0.97)},
  anchor=north west,
  draw=lightgray204
},
tick align=outside,
tick pos=left,
x grid style={darkgray176},
xlabel={x label},
xmajorgrids,
xmin=-1.1, xmax=1.1,
xtick style={color=black},
y grid style={darkgray176},
ylabel={y label},
ymajorgrids,
ymin=0.586857217748334, ymax=1.01967294096292,
ytick style={color=black}
]
\addplot [semithick, steelblue31119180, forget plot]
table {
-1 0.606530659712633
-0.997997997997998 0.607744933684566
-0.995995995995996 0.608959197911498
(以下中略)
0.997997997997998 0.607744933684566
1 0.606530659712633
};
\end{axis}

\end{tikzpicture}

あとはこのtexファイルをそのまま使うもよし,色々修正して利用するもよしだ.Tikzで図を作るということは対外的な発表や大事な文書などに使うケースが多いだろうから,基本的には追加で修正していくことになると思う.特に個人的には以下のような点に注意が必要だと思う.

  • データが(おそらく)常に数値で保存されてしまうので,関数のプロットに直したり,ファイルからデータを読み込む形式に変更したりという作業は常に必要だと思う.
  • この手のツールとしてはありがちだがたまに綺麗に変換されないケースがある.
  • 3D plotでは使えない(公式マニュアルでも言及あり).

(追記) matplotlib.3.8.0以降で使えない問題

自分の環境に入っているtikzplotlib 0.10.1はmatplotlib3.8系とは互換性がなかった.matplotlibの3.8でbackend_pgf.common_texificationが廃止されてしまったのが原因.

(追記) matplotlib.3.7.0で利用する.

そこで,別途tikzplotlib専用に仮想環境を作成し,matplotlib3.7.0系を利用するとうまくいく.

conda create -n tikzplotlib
conda activate tikzplotlib
pip install matplotlib==3.7.3
pip install tikzplotlib

ただし,このままだと実際にtikzplotlibを実行したときに以下のように怒られてしまった.

/path/to/lib/python3.12/site-packages/tikzplotlib/_legend.py", line 81, in draw_legend
    if obj._ncol != 1:
AttributeError: 'Legend' object has no attribute '_ncol'. Did you mean: '_ncols'?

そこで,この_legend.py内のif文を

if obj._ncols != 1:

と書き換えてやるとうまくいく.この問題はtikzplotlibのgithubのissueにも立てられているが今のところ修正されていないようだ.

まとめ

完璧ではないものの,matplotlibのプロットを手軽にtikz形式に変換できるツールなので,普段の解析はpythonやjupyterでやってるけど最後にまとめる時はやっぱりtexが良いという人にはかなりおすすめできるツールだと思う.

参考文献

Tags:

Categories:

Updated: