
Мой вопрос тесно связан сВот этот, на который пока нет ответа, и который может привлечь больше внимания в этой более общей формулировке.
Предположим, что группа точек (абсцисса, ордината) содержит отсутствующие или бесконечные значения, которые можно каким-то образом пометить, например, непосредственно имея их nan
на ординате, как я предполагаю ниже, или проверив значения, выходящие за пределы, как ввышеупомянутый вопрос. Есть ли простая модификация, \listplot
которая бы построиларазные кривые для каждой группы смежных значений без пропущенных/бесконечных значений?
Ниже приведена иллюстрация. Сначала я наношу черными линиями данные без пропущенных значений. Затем я даю те же точки, но с пропущенными значениями; я использую трюк с переопределением nan
(или любой пользовательский флаг), чтобы просто избавиться от них. Однако график красного цвета неудовлетворителен, потому что линии соединяют окружающие значения. Синим цветом я наношу «вручную» (т. е. вызывая несколько \listplot
) результат, который я хотел бы получить автоматически; обратите внимание, что изолированную точку можно просто отбросить.
\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}
решение1
pgfplots
имеет встроенную функцию с опцией unbounded coords=jump
.
Я не знаю, откуда у вас данные. Если они у вас в текстовом файле data.dat
в формате
1 2
2 1
3 1
4 nan
etc.
то вы можете использовать это непосредственно в \addplot
команде, как \addplot [unbounded coords=jump] table {data.dat};
. Если у вас есть несколько столбцов в файле, вы можете выбрать, какие из них использовать, например \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}
решение2
\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}