怠けるLaTeX (Pandasとgnuplot)
TL;DR
- スプレッドシートからtsv
- tsvからLaTeXの表をコマンドひとつで生成できる
- tsvから(.texファイルの)図をコマンドひとつで生成できる
なお,今回扱うコードは全て以下のリポジトリで公開されています.
モチベーション
学生実験でレポートを書くときにwordなど論外)
ところで,
また,グラフ(グラフ理論のグラフではない)を生成するときにどうしますか?
ここでは,アカデミックヤクザに(おそらく)怒られずにデータから表とグラフを生成する方法を紹介します.
全体像

表やプロットするデータは既にあるものとします.
tsvからLaTeXの表を生成する
したいこと: tsvから表を生成すること(下図参照)

- 先頭行をアンコメントする(これはgnuplotでグラフをプロットする際(後述)に同じデータを使いたいから)
- csv(tsv)として読み取る
- 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からグラフを生成する
次のプログラムを実行してグラフを生成します.
#!/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すれば,グラフが得られます.

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