Tikz addplot заполнить между в зависимости от знака

Tikz addplot заполнить между в зависимости от знака

У меня следующая проблема. Я считываю данные из таблицы и строю график, а затем заполняю область между осью x и кривой. Это работает нормально. Ну, по крайней мере, немного. Я хочу, чтобы «отрицательная часть» была заполнена другим цветом, чем «положительная часть» кривой. Мой код выглядит примерно так

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

Результат: введите описание изображения здесь

решение1

Нет необходимости в fillbetweenбиблиотеке. Вы можете построить график дважды, но обрезать результат выше или ниже оси 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}

введите описание изображения здесь

решение2

Библиотеке fillbetweenнужна splitопция, если она должна применять разные стили для разных сегментов. Кроме того, второй путь ( Bв вашем примере) должен иметь ту же ширину, что и первый путь. В вашем примере Bохватывает только диапазон от x=0 до x=1, хотя входные данные охватывают диапазон от 0 до 140.

Вот пример с 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}

введите описание изображения здесь

Обратите внимание, что fillbetweenна самом деле это не срабатывает, если вы используете every even segment/.style: по-видимому, он считает "пустую" область y=0как свой собственный сегмент. Я обошел эту проблему с помощью явно предоставленных индексов сегментов (не очень общих, согласен...)

Обратите внимание, что это \path[name path=B] (0,0) -- (150,0);правильно: он использует pgfplotsединицы (начиная с compat=1.11). Более старым версиям нужно (axis cs:0,0) -- (axis cs:150,0).

Связанный контент