😎

怠けるLaTeX (Pandasとgnuplot)

2022/02/22に公開

TL;DR

  • スプレッドシートからtsv
  • tsvからLaTeXの表をコマンドひとつで生成できる
  • tsvから(.texファイルの)図をコマンドひとつで生成できる

なお,今回扱うコードは全て以下のリポジトリで公開されています.
https://github.com/rand-tech/random-report-template

モチベーション

学生実験でレポートを書くときに\rm\LaTeXがデファクトスタンダードだという前提で話します.(wordなど論外)
ところで,\rm\LaTeXで表を作る際にどのように作りますか? webサイトを使うという方法もありますが面倒くさいです.
また,グラフ(グラフ理論のグラフではない)を生成するときにどうしますか?
ここでは,アカデミックヤクザに(おそらく)怒られずにデータから表とグラフを生成する方法を紹介します.

全体像

全体像のフローチャート
表やプロットするデータは既にあるものとします.

tsvからLaTeXの表を生成する

したいこと: tsvから表を生成すること(下図参照)
tsvから生成されたPDF

  1. 先頭行をアンコメントする(これはgnuplotでグラフをプロットする際(後述)に同じデータを使いたいから)
  2. csv(tsv)として読み取る
  3. tableとして出力

これらをmake_table.pyを用いて実現しています.

1.を解決するために,#''で置換.
2.を解決する際に,pandasのread_csvというメソッドを用います.tsvとして読み取るには, セパレーターを\tにすればよいです(read_csv(..., sep='\t')

pandas.read_csv — pandas 1.4.1 documentation
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html

3.を解決するためにはpandasのto_latexというメソッドを用います.

pandas.DataFrame.to_latex — pandas 1.4.1 documentation
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_latex.html

なお,出力されたtexファイルは,本文中で\input{}として取り込みます.

\input{src/data/latex_e_showcase.csv.tex}

全体のワークフロー
tsvから表を生成するワークフロー

tsvからグラフを生成する

次のプログラムを実行してグラフを生成します.

#!/opt/homebrew/bin/gnuplot

set term tikz
set output "showcase.tex"
set size square
set xlabel "時間$t$ / s	"
set ylabel "水温$T$ / \\si{\\celsius}"
f(t) = a*t + b
fit f(x) "e_showcase.csv" via a, b
plot [t=0:] "e_showcase.csv" notitle, f(t)

上のコードをベースに解説します.

set term tikz
set output "showcase.tex"

これによって出力するファイル名をshowcase.texとして設定します.

set size square

出力するグラフの枠を正方形にします.

set xlabel "時間$t$ / s	"
set ylabel "水温$T$ / \\si{\\celsius}"

x軸とy軸のラベルを設定します.\をエスケープするために\\としていることに注意.(siunitxパッケージを使っていない場合,\si{\celsius}はコンパイルエラーを引き起こします.)

f(t) = a*t + b
fit f(x) "e_showcase.csv" via a, b

理論式に沿った関数(今回の場合 f(t))を宣言し,関数を変数a, bでフィッティングします(このときの変数の値などは,fit.logに出力される).

plot [t=0:] "e_showcase.csv" notitle, f(t)

データとフィッティングした関数をプロットします.

\begin{figure}[H]\centering
  \input{src/data/showcase.tex}
  \caption{Showcase of gnuplot}
  \label{fig:showcaseGnuplot}
\end{figure}

最後に,本文中で,figure環境でinputすれば,グラフが得られます.

tsvからグラフを生成するワークフロー

makefile

makefileを使いましょう.

最後に

実験レポート頑張ってください.
なお,最初にも書いたとおり,今回扱ったコードは全て以下のリポジトリで公開されています.試してみたい方はどうぞ.
random-report-template / rand-tech
https://github.com/rand-tech/random-report-template

Discussion