Plotten einer Punkteliste unter Ignorieren fehlender oder unendlicher Werte

Plotten einer Punkteliste unter Ignorieren fehlender oder unendlicher Werte

Meine Frage hängt eng mitDieses hier, die noch nicht beantwortet wurde und in dieser allgemeineren Formulierung möglicherweise mehr Aufmerksamkeit erhält.

Nehmen wir an, dass eine Reihe von (Abszissen-, Ordinaten-)Punkten fehlende oder unendliche Werte enthält, die irgendwie gekennzeichnet werden können, zum Beispiel durch direktes Einfügen nanin die Ordinate, wie ich unten annehme, oder durch Testen von Werten außerhalb der Grenzen wie in deroben genannte Frage. Gibt es eine einfache Modifikation, mit \listplotder man eineunterschiedliche Kurve für jede Gruppe von zusammenhängenden Werten ohne fehlenden/unendlichen Wert?

Unten sehen Sie eine Illustration. Zuerst zeichne ich die Daten ohne fehlende Werte in schwarzen Linien auf. Dann gebe ich dieselben Punkte an, aber mit fehlenden Werten; ich verwende einen Trick, bei dem ich sie neu definiere nan(oder ein beliebiges benutzerdefiniertes Flag), um sie einfach loszuwerden. Die Darstellung in Rot ist jedoch nicht zufriedenstellend, da Linien die umliegenden Werte verbinden. In Blau zeichne ich „von Hand“ (d. h. indem ich mehrere aufrufe \listplot) das Ergebnis auf, das ich automatisch erhalten möchte; beachten Sie, dass ein isolierter Punkt einfach verworfen werden kann.

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

Antwort1

pgfplotshat diese Funktion mit der Option integriert unbounded coords=jump.

Ich weiß nicht, woher Ihre Daten stammen. Wenn Sie sie in einer Textdatei data.datim Format

1 2 
2 1
3 1
4 nan
etc.

dann können Sie das direkt im \addplotBefehl verwenden, als \addplot [unbounded coords=jump] table {data.dat};. Wenn Sie in einer Datei mehrere Spalten haben, können Sie auswählen, welche verwendet werden sollen, z. B. mit \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}

Bildbeschreibung hier eingeben

Antwort2

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

Bildbeschreibung hier eingeben

verwandte Informationen