2 つの空白行で区切られた 2 番目のデータ ブロックを使用する pgfplot

2 つの空白行で区切られた 2 番目のデータ ブロックを使用する pgfplot

LaTeX で pgfplots を使用して、gnuplot のインデックス関数で使用するためにフォーマットされたファイルからデータをプロットします。データ ファイルには、2 つの空白行で区切られた x、y 列のセットがあります (gnuplot 形式)。

10  10              
20  18      
30  36      


10  11
20  20
30  41

gnuplotを使えば、

plot 'data.dat' index 0 u 1:1 with p lw 2 pt 4 ps 1 lc rgb 'red' t 'One, \
'' index 1 u 1:2 with p lw 2 pt 5 ps 1 lc rgb 'blue' t 'Two'

データ ファイルを別の形式で書き直さずに、このデータ形式を pgfplots でプロットできますか? pgfplots には、gnuplot のインデックスに相当するものはありますか? 私の理解では、pgfplot のインデックスは、データの 2 番目のブロックではなく、複数列データの列番号を参照します。

答え1

まず、gnuplotがどのように解析するかを見てみましょう。私が理解している限りではindex 0 u 1:2、最初の(ゼロインデックスの)ブロックを見て、列1を次のように使用します。バツ2列目はええ値。これは、パッケージを使用してデータをプロットすることで表示できますgnuplottex

\documentclass[border=10pt]{standalone}
\usepackage{xcolor, gnuplottex}

\begin{filecontents}[noheader]{data.dat}
10  10              
20  18      
30  36      


10  11
20  20
30  41
\end{filecontents}

\begin{document}

\begin{gnuplot}[terminal=epslatex]
plot 'data.dat' index 0 u 1:2 with p lw 2 pt 4 ps 1 lc rgb 'red'  t 'One', \
             '' index 1 u 1:2 with p lw 2 pt 4 ps 1 lc rgb 'blue' t 'Two'
\end{gnuplot}

\end{document}

ここに画像の説明を入力してください


つまり、現在いるブロックを識別するインデックスを各行に追加する必要があるだけです。

他のソフトウェアでこれを行う方が簡単かもしれませんが、TeXでファイルを変換し、各行にインデックス列を追加することができます。その後、次の方法でデータをフィルタリングできます。このアプローチ

次のコードは、ファイルを読み込み、2 行連続する空白行がある場合に増加するインデックス (1 から始まる整数) を追加します。新しいデータはファイルに書き込まれ、data_index.datその後 PGFPlots で読み込むことができます。

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\begin{filecontents}[noheader]{data.dat}
10  10              
20  18      
30  36      


10  11
20  20
30  41
\end{filecontents}

\ExplSyntaxOn
\cs_generate_variant:Nn \iow_now:Nn { Ne }
\int_new:N \l_csnl_gnutopgf_index_int
\int_set:Nn \l_csnl_gnutopgf_index_int { 1 }
\bool_new:N \l_csnl_gnutopgf_blank_line_bool
\bool_set_false:N \l_csnl_gnutopgf_blank_line_bool
\ior_new:N \g_csnl_gnutopgf_input_ior
\ior_open:Nn \g_csnl_gnutopgf_input_ior { data.dat }
\iow_new:N \g_csnl_gnutopgf_output_iow
\iow_open:Nn \g_csnl_gnutopgf_output_iow { data_index.dat }
\iow_now:Nn \g_csnl_gnutopgf_output_iow { index ~ x ~ y }
\ior_str_map_inline:Nn \g_csnl_gnutopgf_input_ior {
    \bool_if:NT \l_csnl_gnutopgf_blank_line_bool {
        \str_if_empty:nT {#1} {
            \int_incr:N \l_csnl_gnutopgf_index_int
        }
        \bool_set_false:N \l_csnl_gnutopgf_blank_line_bool
    }
    \str_if_empty:nTF {#1} {
        \bool_set_true:N \l_csnl_gnutopgf_blank_line_bool
    } {
        \bool_set_false:N \l_csnl_gnutopgf_blank_line_bool
        \iow_now:Ne \g_csnl_gnutopgf_output_iow { 
            \int_eval:n { \l_csnl_gnutopgf_index_int } ~ #1
        }
    }
}
\ior_close:N \g_csnl_gnutopgf_input_ior
\iow_close:N \g_csnl_gnutopgf_output_iow
\ExplSyntaxOff

\begin{document}

\pgfplotsset{
    only index/.style={
        x filter/.code={
            \edef\tempa{\thisrow{index}}
            \edef\tempb{#1}
            \ifx\tempa\tempb\else
                \def\pgfmathresult{inf}
            \fi
        }
    }
}

\begin{tikzpicture}
\begin{axis}[legend pos=north west]
    \addplot table[x=x, y=y, only index=1]{data_index.dat};
    \addlegendentry{One}
    \addplot table[x=x, y=y, only index=2]{data_index.dat};
    \addlegendentry{Two}
\end{axis}
\end{tikzpicture}

\end{document}

ここに画像の説明を入力してください

関連情報