Plots+pgfplotsx⇒LaTeX

# 序

綺麗なグラフを作りたい…
しかしなるべく苦労をしたくないですよね(Juliaですべて済ませたい)。
そこで今回は、適当なグラフを.texで保存し、LaTeXでコンパイルしてpdfファイルを得ることを目的とします。
どうやらpgfplotsxを用いれば.texで保存できるらしいです。

# 環境
Windows 10 Home
julia 1.4.0
Jupyter Lab v1.2.6



# Julia側

まずPlotsを呼び出しておきます。
また、.texで保存するため、バックエンドにpgfplotsxを用います。


```julia
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)
)
```

適当な関数を用意してプロットします。

```julia
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で保存した結果は次の通りです。

![testfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677437/9cbf78fe-8a28-9e9e-ed81-d279366eba17.png)

これだけでもそれなりに綺麗なグラフができましたが、凡例と挿入した文字において下付きの添え字がうまく機能していません。
おそらくpyplotなどをバックエンドに選べば解決するのでしょうが、今回欲しいのは.texファイルです。
したがってここでは諦めます。


# LaTeX側

.texで保存したファイルをinputしてコンパイルします。


```tex

\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を覗いてみましょう。

```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で下付きが機能していない原因はここにありそうですね。

```tex
\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}
```

このように成形した後にコンパイルすると、以下のようになります。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677437/79997487-409d-f55b-f902-123cb80f22b1.png)


目的達成!!!
しかしながらいちいちこの作業をしなければならないとなると面倒です。
次の課題はこの作業をしなくて済むようにすることです。
まだ諸々の仕組みが理解できていないので、仕組みが理解できたら追記します。

# 2021/2/9追記
tenfu2tea様からご指摘いただきまして、
エラーは

```tex
\usetikzlibrary{backgrounds}
```

をプリアンブルに追加することで回避できるようです。
コメントいただきありがとうございます。


# 2021/2/13追記

## pyplotをバックエンドにした場合
LaTeXStrignsを使って下付き文字が出力できました。

```julia
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()
```

![testfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677437/58726477-a6d9-e90c-ede4-fcd3c2a2c34e.png)

## grをバックエンドにした場合

`latex: failed to create a dvi file`というエラーが出てうまくいきませんでした。

```julia
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にすると、前節のプログラムで動きました。
![testfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677437/e6d837da-36b5-fcaa-33ce-3ea00658cca8.png)
まだ調査は必要かもしれませんが、ひとまず報告です。