5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Plots+pgfplotsx⇒LaTeX

Last updated at Posted at 2021-02-09

綺麗なグラフを作りたい…
しかしなるべく苦労をしたくないですよね(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で保存した結果は次の通りです。

testfig.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}

このように成形した後にコンパイルすると、以下のようになります。
キャプチャ.PNG

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

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

testfig.png

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にすると、前節のプログラムで動きました。
testfig.png
まだ調査は必要かもしれませんが、ひとまず報告です。

5
5
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?