序
綺麗なグラフを作りたい…
しかしなるべく苦労をしたくないですよね(Juliaですべて済ませたい)。
そこで今回は、適当なグラフを.texで保存し、LaTeXでコンパイルしてpdfファイルを得ることを目的とします。
どうやらpgfplotsxを用いれば.texで保存できるらしいです。
環境
Windows 10 Home
julia 1.4.0
Jupyter Lab v1.2.6
Julia側
まずPlotsを呼び出しておきます。
また、.texで保存するため、バックエンドにpgfplotsxを用います。
using Plots
pgfplotsx(
framestyle=:box,
titlefont=Plots.font("sans-serif", 14),
legendfont=Plots.font("sans-serif", 14),
guidefont=Plots.font("sans-serif", 14),
tickfont=Plots.font("sans-serif", 14)
)
適当な関数を用意してプロットします。
function f(x)
return sin(x)/x
end
function g(x)
return atan(x)
end
function plot_test()
x = collect(-4pi:0.01:4pi)
y1 = f.(x)
y2 = g.(x)
plot(x,y1,
xaxis=(raw"$k_x$"),
xlim=(-4pi,4pi),
xticks=([-4pi,-3pi,-2pi,-pi,0,pi,2pi,3pi,4pi],
[raw"-4 \pi",raw"-3 \pi",raw"-2 \pi",raw"- \pi",raw"0",raw"\pi",raw"2 \pi",raw"3 \pi",raw"4 \pi"]
),
yaxis=(raw"$E_k$"),
label=raw"$f_k$",
legend=:topleft,
line=:solid
)
plot!(x,y2,
label=raw"$\sigma_z$",
legend=:topleft,
line=:dash
)
annotate!(5, 0.8, Plots.text(raw"$\Sigma_\alpha=0.1 \textrm{eV/\AA}$", 16, :blue, :center))
#savefig("testfig.tex")
#savefig("testfig.png")
end
plot_test()
.pngで保存した結果は次の通りです。
これだけでもそれなりに綺麗なグラフができましたが、凡例と挿入した文字において下付きの添え字がうまく機能していません。
おそらくpyplotなどをバックエンドに選べば解決するのでしょうが、今回欲しいのは.texファイルです。
したがってここでは諦めます。
LaTeX側
.texで保存したファイルをinputしてコンパイルします。
\documentclass[a4paper,11pt,dvipdfmx]{jsarticle}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}
\begin{document}
\section{これはテスト}
%fig----------------------------------------------------------------
\begin{figure}[ht]
\centering
\scalebox{0.9}{\input{testfig}}
\caption{texファイルをインプットする。}
\end{figure}
%fig----------------------------------------------------------------
\end{document}
これをそのまま実行すると、次のようなエラーが返ってきます。
Package pgfkeys Error: I do not know the key '/tikz/show background rectangle' and I am going to ignore it. Perhaps you misspelled it. ... opacity={1.0}}, show background rectangle]
そこで保存したtestfig.texを覗いてみましょう。
\begin{tikzpicture}[/tikz/background rectangle/.style={fill={rgb,1:red,1.0;green,1.0;blue,1.0}, draw opacity={1.0}}, show background rectangle]
\begin{axis}[title={},
title style={at={{(0.5,1)}},
-------------------省略-------------------
\addplot[
-------------------省略-------------------
(12.563629385640827,-0.0002181873725434463)
}
;
\addlegendentry {$f\_k$}
\node
[, color={rgb,1:red,0.0;green,0.0;blue,1.0}, draw opacity={1.0}, rotate={0.0}, font={{\fontsize{16 pt}{20.8 pt}\selectfont}}] at (axis cs:5, 0.8) {$\Sigma\_\alpha=0.1 \textrm{eV/\AA}$};
\addplot[
-------------------省略-------------------
(12.563629385640827,1.4913689430904356)
}
;
\addlegendentry {$\sigma\_z$}
\node
[, color={rgb,1:red,0.0;green,0.0;blue,1.0}, draw opacity={1.0}, rotate={0.0}, font={{\fontsize{16 pt}{20.8 pt}\selectfont}}] at (axis cs:5, 0.8) {$\Sigma\_\alpha=0.1 \textrm{eV/\AA}$};
\end{axis}
\end{tikzpicture}
問題なさそうなところは省略させていただいております。
さて、エラーはkeyがないと言っているので、思い切って
[/tikz/background rectangle/.style={fill={rgb,1:red,1.0;green,1.0;blue,1.0}, draw opacity={1.0}}, show background rectangle]
を消してみます。
また、annotateで入れた文字列が2つあるので、片方を消します。
さらに下付きの添え字に関しても、\_
となっているので、バックスラッシュを消去します。
pngで下付きが機能していない原因はここにありそうですね。
\begin{tikzpicture}
\begin{axis}[title={},
title style={at={{(0.5,1)}},
-------------------省略-------------------
\addplot[
-------------------省略-------------------
(12.563629385640827,-0.0002181873725434463)
}
;
\addlegendentry {$f_k$}
\addplot[
-------------------省略-------------------
(12.563629385640827,1.4913689430904356)
}
;
\addlegendentry {$\sigma_z$}
\node
[, color={rgb,1:red,0.0;green,0.0;blue,1.0}, draw opacity={1.0}, rotate={0.0}, font={{\fontsize{16 pt}{20.8 pt}\selectfont}}] at (axis cs:5, 0.8) {$\Sigma_\alpha=0.1 \textrm{eV/\AA}$};
\end{axis}
\end{tikzpicture}
このように成形した後にコンパイルすると、以下のようになります。
目的達成!!!
しかしながらいちいちこの作業をしなければならないとなると面倒です。
次の課題はこの作業をしなくて済むようにすることです。
まだ諸々の仕組みが理解できていないので、仕組みが理解できたら追記します。
2021/2/9追記
tenfu2tea様からご指摘いただきまして、
エラーは
\usetikzlibrary{backgrounds}
をプリアンブルに追加することで回避できるようです。
コメントいただきありがとうございます。
2021/2/13追記
pyplotをバックエンドにした場合
LaTeXStrignsを使って下付き文字が出力できました。
using LaTeXStrings
using Plots
pyplot(
framestyle=:box,
titlefont=Plots.font("sans-serif", 14),
legendfont=Plots.font("sans-serif", 14),
guidefont=Plots.font("sans-serif", 14),
tickfont=Plots.font("sans-serif", 14)
)
function f(x)
return sin(x)/x
end
function g(x)
return atan(x)
end
function plot_test()
x = collect(-4pi:0.01:4pi)
y1 = f.(x)
y2 = g.(x)
plot(x,y1,
xaxis=(L"$ k_x $"),
xlim=(-4pi,4pi),
xticks=([-4pi,-3pi,-2pi,-pi,0,pi,2pi,3pi,4pi],
[L"$-4 \pi$", L"$-3 \pi$", L"$-2 \pi$", L"$-\pi$", L"$0$", L"$\pi$", L"$2 \pi$", L"$3 \pi$", L"$4 \pi$"]
),
yaxis=(L"$E_k$"),
label=L"$f_k$",
legend=:topleft,
line=:solid
)
plot!(x,y2,
label=L"$\sigma_z$",
legend=:topleft,
line=:dash
)
annotate!(5, 0.8, Plots.text(L"$ \Sigma_\alpha=0.1 \mathrm{eV/\AA} $", 16, :blue, :center))
#savefig("testfig.tex")
savefig("testfig.png")
end
plot_test()
grをバックエンドにした場合
latex: failed to create a dvi file
というエラーが出てうまくいきませんでした。
using LaTeXStrings
using Plots
gr(
framestyle=:box,
titlefont=Plots.font("sans-serif", 14),
legendfont=Plots.font("sans-serif", 14),
guidefont=Plots.font("sans-serif", 14),
tickfont=Plots.font("sans-serif", 14)
)
function f(x)
return sin(x)/x
end
function g(x)
return atan(x)
end
function plot_test()
x = collect(-4pi:0.01:4pi)
y1 = f.(x)
y2 = g.(x)
plot(x,y1,
xaxis=(L"$ k_x $"),
xlim=(-4pi,4pi),
xticks=([-4pi,-3pi,-2pi,-pi,0,pi,2pi,3pi,4pi],
[L"$-4 \pi$", L"$-3 \pi$", L"$-2 \pi$", L"$-\pi$", L"$0$", L"$\pi$", L"$2 \pi$", L"$3 \pi$", L"$4 \pi$"]
),
yaxis=(L"$E_k$"),
label=L"$f_k$",
legend=:topleft,
line=:solid
)
plot!(x,y2,
label=L"$\sigma_z$",
legend=:topleft,
line=:dash
)
annotate!(5, 0.8, Plots.text(L"$ \Sigma_\alpha=0.1 \mathrm{eV/\AA} $", 16, :blue, :center))
#savefig("testfig.tex")
savefig("testfig.png")
end
plot_test()
バージョン更新をし、grを使った場合
juliaをv1.5.3にして、Plots v1.10.4にすると、前節のプログラムで動きました。
まだ調査は必要かもしれませんが、ひとまず報告です。