
Tengo lo siguiente:
\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 dar sombra en un área confinada entre
f(x) = 1
y
g(x) = |x|
Sin embargo, lo que aparece en su lugar es:
El gráfico está dibujado pero el área no está sombreada. Intenté cambiar las dos funciones por otras alternativas y funciona, así que no estoy muy seguro de cuál es el problema aquí. (Estoy usando ShareLaTex)
Respuesta1
(Para que conste: con el lanzamiento de PGFPlots v1.16 su ejemplo da el resultado esperado. Pero hay una manera mejor y más fácil de lograr lo que desea).
En lugar de utilizar, domain
utilice split
el que le ofrece 3 segmentos que se pueden manejar individualmente. Así que dé la opción general de no rellenar nada ( fill=none
) y luego indique en el segment no 1
estilo " " el patrón de relleno que desee. (Los segmentos comienzan a contar con 0, es por eso que el número 1 es el que necesitas/quieres aquí).
% 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}
Respuesta2
Consideraría que esto es un error (o al menos un comportamiento inesperado) en la fillbetween
biblioteca de pgfplots
. Tenga en cuenta que esta es solo mi opinión personal como usuario, puede ser que haya una razón específica por la que se comporta de esa manera.
Considere el siguiente ejemplo, donde eliminé todas las partes que no son necesarias para reproducir este comportamiento. Como en su ejemplo, el área no está llena. Sin embargo, si simplemente comenta la axis lines=middle
línea, el área se llenará como se esperaba.
\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 haber un problema al manejar el punto 0
cuando lo ha axis lines=middle
habilitado. Una solución sencilla es utilizar uno fill between
de -1:0
y otro independiente de 0:1
. Alternativamente, utilice el split
método propuesto 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}];