
У меня есть следующее:
\documentclass{article}
\usepackage{pgfplots}
\usepackage{mathtools}
\usepgfplotslibrary{fillbetween}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis lines = middle,
xlabel = $x$,
ylabel = {$\begin{aligned}
\color{blue} f(x)& \color{blue}=1\\
\color {red} g(x)& \color{red}=|x|
\end{aligned}$}
]
\addplot [
name path = A,
domain=-2:2,
color=blue,
]
{1};
\addplot [
name path = B,
domain=-2:2,
color=red,
]
{abs(x))};
\addplot [
pattern=north west lines,
]
fill between [
of=A and B,
soft clip={domain=-1:1}
];
\end{axis}
\end{tikzpicture}
\end{document}
который я стремлюсь заштриховать в области, ограниченной между
f(x) = 1
и
g(x) = |x|
Однако вместо этого появляется следующее:
График нарисован, но область не закрашена. Я попробовал заменить две функции альтернативными, и это работает, так что я не совсем уверен, в чем здесь проблема. (Я использую ShareLaTex)
решение1
(Для справки: с выходом PGFPlots v1.16 ваш пример дает ожидаемый результат. Но есть лучший/более простой способ добиться желаемого.)
Вместо использования domain
используйте split
, который дает вам 3 сегмента, которые можно обрабатывать по отдельности. Поэтому дайте общую возможность ничего не заполнять ( fill=none
), а затем укажите в segment no 1
стиле " " желаемый вами шаблон заливки. (Сегменты начинаются с 0, поэтому номер 1 — это тот, который вам нужен/желается здесь.)
% used PGFPlots v.1.14
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usepackage{amsmath}
\usetikzlibrary{
patterns,
pgfplots.fillbetween,
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis lines=middle,
xlabel=$x$,
ylabel={
$\begin{aligned}
\color{blue} f(x)& \color{blue}=1\\
\color {red} g(x)& \color{red}=|x|
\end{aligned}$
},
]
\addplot [
name path=A,
domain=-2:2,
color=blue,
] {1};
\addplot [
name path = B,
domain=-2:2,
color=red,
] {abs(x)};
\addplot [
fill=none,
] fill between [
of=A and B,
% --------------------------------------
% the below code is what I have changed
split,
% draw only selected ones:
% every segment no 0/.style: invisible
every segment no 1/.style={
pattern=north west lines,
},
% every segment no 2/.style: invisible
];
\end{axis}
\end{tikzpicture}
\end{document}
решение2
Я бы посчитал это ошибкой (или, по крайней мере, неожиданным поведением) в библиотеке fillbetween
. pgfplots
Обратите внимание, это всего лишь мое личное мнение как пользователя, возможно, есть определенная причина, по которой он ведет себя таким образом.
Рассмотрим пример ниже, где я удалил все части, которые не нужны для воспроизведения этого поведения. Как и в вашем примере, область не заполнена. Однако, если вы просто закомментируете строку axis lines=middle
, область будет заполнена, как и ожидалось.
\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis lines=middle,
domain=-2:2,
]
\addplot[name path=A,color=blue]{1};
\addplot[name path=B,color=red]{abs(x))};
\addplot[black] fill between[of=A and B,soft clip={domain=-1:1}];
\end{axis}
\end{tikzpicture}
\end{document}
Кажется, есть проблема с обработкой точки, 0
когда вы axis lines=middle
включили. Простой способ обойти это использовать один fill between
из-1:0
и отдельную из 0:1
. В качестве альтернативы используйте split
метод, предложенный Стефаном Пинновом.
\addplot[pattern=north west lines] fill between[of=A and B,soft clip={domain=-1:0}];
\addplot[pattern=north west lines] fill between[of=A and B,soft clip={domain=0:1}];