
Eu tenho o seguinte:
\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}
que pretendo sombrear em uma área confinada entre
f(x) = 1
e
g(x) = |x|
O gráfico está desenhado, mas a área não está sombreada. Tentei trocar as duas funções por outras alternativas e funcionou, então não tenho muita certeza de qual é o problema aqui. (Estou usando ShareLaTex)
Responder1
(Para registro: com o lançamento do PGFPlots v1.16, seu exemplo fornece o resultado esperado. Mas existe uma maneira melhor/mais fácil de conseguir o que você deseja.)
Em vez de usar, domain
use split
o que fornece 3 segmentos que podem ser manipulados individualmente. Então dê a opção geral de não preencher nada ( fill=none
) e então indique para o segment no 1
estilo " " o padrão de preenchimento desejado. (Os segmentos começam a contar com 0, por isso o número 1 é o que você precisa/deseja aqui.)
% 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}
Responder2
Eu consideraria isso um bug (ou pelo menos um comportamento inesperado) na fillbetween
biblioteca do pgfplots
. Observe que esta é apenas minha visão pessoal como usuário; pode ser que haja um motivo específico para ele se comportar dessa maneira.
Considere o exemplo abaixo, onde retirei todas as partes desnecessárias para reproduzir esse comportamento. Como no seu exemplo, a área não está preenchida. Porém, se você apenas comentar a axis lines=middle
linha, a área será preenchida conforme o esperado.
\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}
Parece haver um problema ao lidar com o ponto 0
quando você axis lines=middle
ativou. Uma solução simples é usar um fill between
from -1:0
e outro from 0:1
. Alternativamente, use o split
método proposto por Stefan 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}];