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 的发布,您的示例给出了预期的结果。但是有更好/更简单的方法来实现您想要的。)

不要使用domainuse 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。或者,使用splitStefan Pinnow 提出的方法。

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

解决方法的结果

相关内容