pgfplot verwendet den zweiten Datenblock, der durch zwei leere Zeilen getrennt ist

pgfplot verwendet den zweiten Datenblock, der durch zwei leere Zeilen getrennt ist

Ich möchte pgfplots in Latex verwenden, um Daten aus einer Datei zu plotten, die für die Verwendung mit der Indexfunktion von gnuplot formatiert wurde. Die Datendatei enthält Sätze von x,y-Spalten, die durch zwei leere Zeilen getrennt sind (Gnuplot-Format).

10  10              
20  18      
30  36      


10  11
20  20
30  41

Mit gnuplot kann ich

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'

Kann ich dieses Datenformat mit pgfplots darstellen, ohne die Datendatei in ein anderes Format umzuschreiben? Gibt es in pgfplots etwas, das dem Index von gnuplot entspricht? Soweit ich weiß, bezieht sich der pgfplot-Index auf Spaltennummern in mehrspaltigen Daten, nicht auf den zweiten Datenblock.

Antwort1

Schauen wir uns zunächst an, wie gnuplot die Dinge analysiert. Soweit ich es verstehe, index 0 u 1:2bedeutet das: Betrachten Sie den ersten (nullindizierten) Block und verwenden Sie Spalte 1 alsXund Spalte 2 alsjWerte. Dies kann durch die Darstellung der Daten mit dem Paket gezeigt werden 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}

Bildbeschreibung hier eingeben


Das heißt: Wir müssen an jede Zeile lediglich einen Index anhängen, der den Block identifiziert, in dem wir uns gerade befinden.

Mit einer anderen Software ist das wahrscheinlich einfacher, aber Sie können TeX die Datei konvertieren lassen und jeder Zeile eine Indexspalte hinzufügen lassen. Anschließend können Sie die Daten filtern mitdieser Ansatz.

Im Folgenden wird die Datei eingelesen und ein Index (eine Ganzzahl beginnend bei 1) angehängt, der bei zwei aufeinanderfolgenden Leerzeilen erhöht wird. Die neuen Daten werden in die Datei geschrieben, data_index.datdie Sie dann mit PGFPlots einlesen können.

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

Bildbeschreibung hier eingeben

verwandte Informationen