
У меня следующая проблема. Я считываю данные из таблицы и строю график, а затем заполняю область между осью 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)
.