
eu tenho o seguinte problema. Eu leio os dados de uma tabela e os ploto e, em seguida, preencho a área entre o eixo x e a curva. Isso funciona bem. Bem, pelo menos um pouco. Quero que a “parte negativa” seja preenchida com outra cor que não a “parte positiva” da curva. Meu código se parece com isso
\documentclass[paper=a4,fontsize=12pt,open=any,numbers=noenddot]{scrreprt}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}
[xlabel={$t$ [s]},ylabel={y}, xmin=0, xmax=140, ymin=-0.6, ymax=1.2, grid, width=14.5cm, height=7cm]
\addplot plot [name path=A, color=black, mark=no] table{test.txt};
\addplot[name path=B,black,mark=no,line width=0.01pt] coordinates {(0,0) (1,0)};
\addplot[gray!40] fill between[of=A and B];
\end{axis}
\end{tikzpicture}
\caption{test}
\label{fig:test}
\end{figure}
\end{document}
Resultado:
Responder1
Não há necessidade de fillbetween
biblioteca. Você pode plotar duas vezes seus dados, mas cortando o resultado acima ou abaixo do eixo y.
\documentclass[paper=a4,fontsize=12pt,open=any,numbers=noenddot]{scrreprt}
\usepackage{filecontents}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
%\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{filecontents}{test.txt}
0 0
16 0
16 0.125
44 0.125
44 0.25
56 0.25
56 -0.125
64 -0.125
64 0
80 0
80 0.125
104 0.125
104 0.25
116 0.25
116 -0.125
124 -0.125
124 0
140 0
\end{filecontents}
\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}
[xlabel={$t$ [s]},ylabel={y}, xmin=0, xmax=140, ymin=-0.6, ymax=1.2, grid, width=14.5cm, height=7cm]
% \addplot plot [name path=A, color=black, mark=no] table{test.txt};
% \addplot[name path=B,black,mark=no,line width=0.01pt, domain=0:140] {0};
\begin{scope}
\clip (axis cs:0,0) rectangle (axis cs:140,1.2);
\addplot plot [color=black, mark=no,fill=red] table{test.txt}\closedcycle;
\end{scope}
\begin{scope}
\clip (axis cs:0,0) rectangle (axis cs:140,-1.2);
\addplot plot [color=black, mark=no,fill=green] table{test.txt}\closedcycle;
\end{scope}
\end{axis}
\end{tikzpicture}
\caption{test}
\label{fig:test}
\end{figure}
\end{document}
Responder2
A fillbetween
biblioteca precisa da split
opção se deve aplicar estilos diferentes para segmentos diferentes. Além disso, o segundo caminho ( B
no seu exemplo) deve ter a mesma largura que o primeiro caminho. No seu exemplo, B
abrange apenas de x=0 a x=1, embora os dados de entrada abranjam de 0 a 140.
Aqui está um exemplo com fillbetween
:
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}
[xlabel={$t$ [s]},ylabel={y}, xmin=0, xmax=140, ymin=-0.6, ymax=1.2, grid, width=14.5cm, height=7cm]
\addplot[name path=A, color=black] table{
0 0
16 0
16 0.125
44 0.125
44 0.25
56 0.25
56 -0.125
64 -0.125
64 0
80 0
80 0.125
104 0.125
104 0.25
116 0.25
116 -0.125
124 -0.125
124 0
140 0
};
\path[name path=B] (0,0) -- (150,0);
\addplot[red] fill between[of=A and B,split,
every segment no 1/.style={orange},
every segment no 4/.style={orange},
];
\end{axis}
\end{tikzpicture}
\end{document}
Observe que fillbetween
na verdade falha se você usar every even segment/.style
: aparentemente, ele conta a área "vazia" como y=0
seu próprio segmento. Resolvi esse problema por meio de índices de segmento fornecidos explicitamente (não muito gerais, concordo...)
Observe que \path[name path=B] (0,0) -- (150,0);
está correto: ele usa pgfplots
unidades (começando com compat=1.11
). Versões mais antigas precisam de (axis cs:0,0) -- (axis cs:150,0)
.