pgfplot usando el segundo bloque de datos separados por 2 filas en blanco

pgfplot usando el segundo bloque de datos separados por 2 filas en blanco

Quiero usar pgfplots en látex para trazar datos de un archivo formateado para usar con la función de índice de gnuplot. El archivo de datos tiene conjuntos de columnas x,y separadas por dos filas en blanco (formato gnuplot).

10  10              
20  18      
30  36      


10  11
20  20
30  41

Con gnuplot puedo hacer

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'

Sin reescribir el archivo de datos en un formato diferente, ¿puedo trazar este formato de datos con pgfplots? ¿Hay algo en pgfplots que sea equivalente al índice de gnuplot? El índice pgfplot se refiere a los números de columna en datos de varias columnas, no al segundo bloque de datos, según tengo entendido.

Respuesta1

Primero, veamos cómo gnuplot analiza las cosas. Por lo que tengo entendido, index 0 u 1:2significa: mirar el primer bloque (indexado a cero) y usar la columna 1 comoXy la columna 2 comoyvalores. Esto se puede mostrar trazando los datos usando el gnuplottexpaquete:

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

ingrese la descripción de la imagen aquí


Esto significa: solo necesitamos agregar a cada fila un índice que identifique el bloque en el que nos encontramos actualmente.

Probablemente sea más fácil hacer esto con algún otro software, pero puedes dejar que TeX convierta el archivo y agregue una columna de índice a cada fila. Luego puede filtrar los datos usandoEste enfoque.

Lo siguiente lee el archivo y agrega un índice (un número entero que comienza en 1) que aumenta si se cumplen dos líneas en blanco consecutivas. Los nuevos datos se escriben en el archivo data_index.datque luego puede leer con 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}

ingrese la descripción de la imagen aquí

información relacionada