怠ける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