Затенение области между f = 1 и g = |x|

Затенение области между f = 1 и g = |x|

У меня есть следующее:

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

результат с обходным решением

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