Schattierung im Bereich zwischen f = 1 und g = |x|

Schattierung im Bereich zwischen f = 1 und g = |x|

Ich habe folgendes:

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

die ich in einem Bereich beschatten möchte, der begrenzt ist zwischen

f(x) = 1

Und

g(x) = |x|

Stattdessen wird jedoch Folgendes angezeigt:

Das Diagramm wird gezeichnet, aber der Bereich ist nicht schattiert. Ich habe versucht, die beiden Funktionen durch alternative zu ersetzen, und es funktioniert, daher bin ich mir nicht ganz sicher, was hier das Problem ist. (Ich verwende ShareLaTex)

Antwort1

(Zur Klarstellung: Mit der Veröffentlichung von PGFPlots v1.16 liefert Ihr Beispiel das erwartete Ergebnis. Es gibt jedoch einen besseren/einfacheren Weg, um das gewünschte Ergebnis zu erzielen.)

Verwenden Sie stattdessen domainuse split, wodurch Sie 3 Segmente erhalten, die einzeln bearbeitet werden können. Geben Sie also die allgemeine Option an, nichts auszufüllen ( fill=none), und geben Sie dann im segment no 1Stil „ “ das gewünschte Füllmuster an. (Die Segmente beginnen mit 0 zu zählen, deshalb ist Nummer 1 die Nummer, die Sie hier benötigen/möchten.)

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

Bild, das das Ergebnis des obigen Codes zeigt

Antwort2

Ich würde dies als einen Fehler (oder zumindest als unerwartetes Verhalten) in der fillbetweenBibliothek von betrachten pgfplots. Beachten Sie, dass dies nur meine persönliche Ansicht als Benutzer ist. Es kann sein, dass es einen bestimmten Grund gibt, warum es sich so verhält.

Betrachten Sie das folgende Beispiel, in dem ich alle Teile entfernt habe, die nicht erforderlich sind, um dieses Verhalten zu reproduzieren. Wie in Ihrem Beispiel wird der Bereich nicht ausgefüllt. Wenn Sie die axis lines=middleZeile jedoch einfach auskommentieren, wird der Bereich wie erwartet ausgefüllt.

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

schlechtes Ergebnis gutes Ergebnis

Es scheint ein Problem bei der Verarbeitung des Punkts zu geben, 0wenn Sie aktiviert haben . Eine einfache Problemumgehung besteht darin, einen von und einen separaten von axis lines=middlezu verwenden . Alternativ können Sie die von Stefan Pinnow vorgeschlagene Methode verwenden.fill between-1:00:1split

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

Ergebnis mit Workaround

verwandte Informationen