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:2
significa: 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 gnuplottex
paquete:
\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}
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.dat
que 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}