
Minha pergunta está intimamente relacionadaEste, que ainda não foi respondida e poderá receber mais atenção nesta formulação mais geral.
Suponha que um monte de pontos (abscissa, ordenada) contenham valores ausentes ou infinitos que podem ser sinalizados de alguma forma, por exemplo, colocando-os diretamente nan
na ordenada, como presumo abaixo, ou testando valores fora dos limites, como nopergunta acima mencionada. Existe uma modificação simples \listplot
que traçaria umcurva diferente para cada grupo de valores contíguos sem valor ausente/infinito?
Abaixo está uma ilustração. Primeiro, ploto em linhas pretas os dados sem valores faltantes. Então, dou os mesmos pontos, mas com valores faltantes; Eu uso um truque de redefinição nan
(ou qualquer sinalizador definido pelo usuário) para simplesmente me livrar deles. No entanto, o gráfico em vermelho não é satisfatório, porque as linhas conectam os valores circundantes. Em azul, ploto "manualmente" (ou seja, chamando vários \listplot
) o resultado que gostaria de obter automaticamente; observe que um ponto isolado pode simplesmente ser descartado.
\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}
Responder1
pgfplots
tem esse recurso integrado, com a opção unbounded coords=jump
.
Não sei de onde vêm seus dados. Se você os tiver em um arquivo de texto data.dat
com o formato
1 2
2 1
3 1
4 nan
etc.
então você pode usar isso diretamente no \addplot
comando, como \addplot [unbounded coords=jump] table {data.dat};
. Se você tiver várias colunas em um arquivo, poderá selecionar quais usar, por exemplo \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}
Responder2
\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}