Trazar una lista de puntos ignorando los valores faltantes o infinitos

Trazar una lista de puntos ignorando los valores faltantes o infinitos

Mi pregunta está estrechamente relacionada conÉste, que aún no ha sido respondida y podría recibir más atención en esta formulación más general.

Supongamos que un grupo de puntos (abscisas, ordenadas) contiene valores faltantes o infinitos que se pueden marcar de alguna manera, por ejemplo, teniendo directamente nanen las ordenadas como supongo a continuación, o probando valores fuera de límites como en elpregunta mencionada anteriormente. ¿Existe una modificación simple de \listplotla cual trazaría uncurva diferente para cada grupo de valores contiguos sin valor perdido/infinito?

A continuación se muestra una ilustración. Primero, trazo en líneas negras los datos sin valores faltantes. Luego, doy los mismos puntos pero con valores faltantes; Utilizo un truco de redefinición nan(o cualquier indicador definido por el usuario) para simplemente deshacerme de ellos. Sin embargo, el gráfico en rojo no es satisfactorio, porque las líneas conectan los valores circundantes. En azul, trazo "a mano" (es decir, llamando a varios \listplot) el resultado que me gustaría obtener automáticamente; tenga en cuenta que un punto aislado puede simplemente descartarse.

\begin{pspicture}
\psgrid[subgriddiv=1,griddots=10,gridlabels=7pt](0,0)(10,4)

\savedata{\data}[1 2  2 1  3 1  4 2    5 1    6 2  7 3  8 1    9 2  10 3]
\listplot[linecolor=black]{\data}

\savedata{\data}[1 2  2 1  3 1  4 nan  5 nan  6 2  7 3  8 nan  9 2  10 nan]
\pstVerb{/nan { pop } def} % nice trick to get rid of nan values
\pstScalePoints(1.,1.){}{.1 add} % some vertical shift to allow comparison
\listplot[linecolor=red]{\data}

\pstScalePoints(1.,1.){}{.2 add} % some vertical shift to allow comparison
\savedata{\data}[1 2  2 1  3 1]
\listplot[linecolor=blue]{\data}
\savedata{\data}[6 2  7 3]
\listplot[linecolor=blue]{\data}
% the following goes wrong because isolated point is completed with (0,0)
% \savedata{\data}[9 2]
% \listplot[linecolor=blue]{\data} 
\end{pspicture}

Respuesta1

pgfplotstiene esta característica incorporada, con la opción unbounded coords=jump.

No sé de dónde vienen tus datos. Si los tienes en un archivo de texto data.datcon el formato

1 2 
2 1
3 1
4 nan
etc.

entonces puedes usarlo directamente en el \addplotcomando, como \addplot [unbounded coords=jump] table {data.dat};. Si tiene varias columnas en un archivo, puede seleccionar cuáles usar, por ejemplo \addplot table[x index=0,y index=2] {data.dat};.

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotstableread{ % read in data
1 2 
2 1
3 1
4 nan
5 nan
6 2
7 3
8 nan
9 2
10 nan
}\data
\begin{document}
\begin{tikzpicture}
\begin{axis}[
% axis limits
xmin=0,xmax=10,ymin=0,ymax=4,
% size of plot
% scale only axis means that 10cm is only the axis, not the ticks
width=10cm,height=4cm,scale only axis, 
% add grid
grid=major
]
% plot data with gaps in line
\addplot [blue,very thick,unbounded coords=jump] table {\data};
% default setting, no gaps
\addplot [red,dashed] table {\data};
\end{axis}
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

\documentclass{scrartcl}
\usepackage{pst-plot}
\begin{document}

\begin{pspicture}[showgrid](10,4)
\savedata{\data}[1 2  2 1  3 1  4 2  5 1 6 2  7 3  8 1 9 2  10 3]
\listplot{\data}
\listplot[linecolor=blue,linewidth=2pt,nStart=1,nEnd=3]{\data}
\listplot[linecolor=blue,linewidth=2pt,nStart=6,nEnd=7]{\data}
\end{pspicture} 

\end{document}

ingrese la descripción de la imagen aquí

información relacionada