Exibindo um gráfico pgfplots acima de outro gráfico pgfplots no TikZ

Exibindo um gráfico pgfplots acima de outro gráfico pgfplots no TikZ

Tenho duas soluções gráficas para uma inequação (e uma solução algébrica para ela). Uma solução deve ser exibida na reta numérica e a outra solução deve ser exibida no plano cartesiano. Quero que a reta numérica e o eixo x no plano cartesiano estejam alinhados verticalmente.

A desigualdade é

\begin{equação*} \frac{6}{x - 5} \geq x \end{equação*}

e o conjunto de soluções é $(-\infty,-1) \cup (5,6]$. Portanto, no primeiro gráfico, quero marcas de escala e rótulos para -1, 5e 6e uma linha grossa desenhada à esquerda de -1e entre 5e 6. Com TikZ, usei os seguintes comandos.

\draw[line width=2pt, -latex] ($(-1,0) +(-3pt,0pt)$) -- (-2.9,0);
\draw[fill] (-1,0) circle (3pt);

\draw (5,0) circle (3pt);
\draw[fill] (6,0) circle (3pt);
\draw[line width=2pt] ($(5,0) +(3pt,0pt)$) -- ($(6,0) +(-3pt,0pt)$);

Não tenho certeza de quais pgfplotsseriam os comandos apropriados.

O código da reta numérica não seria compilado. Coloquei linhas de comentários antes da maioria dos comandos da reta numérica.

A propósito, gostaria que os pontos (-1,-1)fossem (6,6)marcados com um círculo preto ou um círculo azul. Por que o ponto está (-1,-1)marcado com um losango azul e o ponto (6,6)marcado com um círculo vermelho?

\documentclass{amsart}
\usepackage{amsmath}
\usepackage{amsfonts}

\usepackage{tikz}
\usetikzlibrary{calc,positioning,intersections}

\usepackage{pgfplots}
\pgfplotsset{compat=1.11}

\begin{document}


\noindent {\textbf{1.) }}Determine the solution set to
\begin{equation*}
\frac{6}{x - 5} \geq x .
\end{equation*}
Graph the solution set on the real number line.
\vskip0.2in

\noindent {\bf Solution} \vskip1.25mm
\noindent $q(x) = 6/(x - 5)$ is a rational function defined on ${\mathbb{R}}\setminus\{5\}$. On the interval $(5, \, \infty)$, $q(x) \geq x$ if, and only if,
\begin{equation*}
(x - 6)(x + 1) = x^{2} - 5x - 6 \leq 0 ,
\end{equation*}
or equivalently, $5 < x \leq 6$. Likewise, on the interval $(-\infty, \, 5)$, $q(x) \geq x$ if, and only if, $x \leq -1$. \rule{1.5ex}{1.5ex}
\vskip0.2in

\noindent \hspace*{\fill}
\begin{tikzpicture}
\begin{axis}[name=plot1, %height=0.5in, width=5in, clip=false,
%    xmin=-10,xmax=16,
%    xlabel=$x$,
%    axis line style={latex-latex},
%    xtick={},
%    extra x ticks={-1,5,6},
%    extra x tick labels={$-1$,5,6},
%    extra x tick style={xticklabel style={below}},
%    xlabel style={at={(ticklabel* cs:1)},anchor=north west}
    ]

  \end{axis}
\begin{axis}[name=plot2, at={($(plot1.south)+(0,-0.75cm)$)}, anchor=north, height=5in, width=5in,
    axis lines=middle, clip=false,
    xmin=-10,xmax=16,
    ymin=-10,ymax=16,
    restrict y to domain=-10:16,
    xtick={\empty},ytick={\empty},
    ticklabel style={font=\tiny,fill=white},
    extra x ticks={-1,6},
    extra x tick labels={$-1$,6},
    axis line style={latex-latex},
    xlabel=$x$,ylabel=$y$,
    enlargelimits={abs=0.25cm},
    xlabel style={at={(ticklabel* cs:1)},anchor=north west},
    ylabel style={at={(ticklabel* cs:1)},anchor=south west}
]
\addplot[samples=501,domain=-10:4.4, blue] {6/(x - 5)};
\addplot[samples=501,domain=5.4:16, blue] {6/(x - 5)} node[above,pos=0.9,font=\footnotesize]{$y=\dfrac{6}{x-5}$};

\addplot[latex-latex, samples=2, domain=-10:15] {x} node[anchor=west, pos=1, font=\footnotesize]{$y=x$};
\addplot[dashed, latex-latex, samples=2, domain=-10:16] (5,x) node [pos=0.05, anchor=north, font=\footnotesize, sloped] {$x=5$};

\addplot coordinates{(-1,-1)};
\addplot coordinates{(6,6)} node[anchor=west,font=\footnotesize]{$(6,6)$};
  \end{axis}

\end{tikzpicture}

\end{document}

Responder1

PGFplots permite que você use todas as funções usuais do TikZ dentro de seu {axis}ambiente. Você tem acesso ao sistema de coordenadas através axis csdo qual \node at (axis cs: 3, 4) {};coloca um nó nox-simcoordenar (3, 4). Na versão 1.11, axis cstornou-se o sistema de coordenadas padrão usado pelo TikZ dentro dos {axis}ambientes, então você não precisa especificar axis cstodas as vezes e, em vez disso, pode apenas digitar \node at (3, 4) {};.

Apresento abaixo duas formas bem parecidas de desenhar (o que eu acho) que você deseja. Ambos traçam as duas curvas relevantes ( xe 6 / (5 - x)), mas o primeiro também usa ox-axis como a reta numérica, enquanto o segundo coloca a reta numérica acima do gráfico.

Versão 1: tudo em um

Esta solução usa um conjunto de eixos para exibir as equações apropriadas para a desigualdade e rotular a parte da reta numérica para a qual a desigualdade é verdadeira:

\documentclass{amsart}

\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amsthm}
\usepackage{thmtools}

\declaretheoremstyle[
  headfont=\normalfont\bfseries,
  numbered=unless unique,
  bodyfont=\normalfont,
  spaceabove=1em plus 0.75em minus 0.25em,
  spacebelow=1em plus 0.75em minus 0.25em,
  qed={\rule{1.5ex}{1.5ex}},
]{solstyle}

\declaretheorem[
  style=solstyle,
  title=Solution,
  refname={solution,solutions},
  Refname={Solution,Solutions}
]{solution}

\usepackage{enumitem}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}

\begin{document}
\begin{enumerate}[label=\bfseries\arabic*)]
\item Determine the solution set to
  \begin{equation*}
    \frac{6}{x - 5} \geq x .
  \end{equation*}
  Graph the solution set on the real number line.

  \begin{solution}
    We first observe that there is a singularity at \(x = 5\) as we consider the
    region above and below \(5\) separately:
    \begin{description}
    \item[\(\boldsymbol{x > 5}\)] Over this interval, the denominator is always
      greater than zero.  As a result, multiplying both sides by \(x-5\) we
      obtain:
      \begin{align*} 
        & 6 \geq x^{2} - 5x \\
        \Leftrightarrow & 0 \geq x^{2} - 5x - 6 = (x-6)(x+1)
      \end{align*}
      Over the given domain, \(x+1\) is always positive; therefore, we must have
      that \(x-6 \leq 0\) and conclude that the inequality is satisfied only for
      \(5 < x \leq 6\).
    \item[\(\boldsymbol{x < 5}\)] Over this internal, the denominator is always
      less than zero.  As a result, multiplying both sides by \(x-5\) flips the
      inequality and we obtain:
      \begin{align*} 
        & 6 \leq x^{2} - 5x \\
        \Leftrightarrow & 0 \leq x^{2} - 5x - 6 = (x-6)(x+1)
      \end{align*}
      Over the given domain, \(x-6\) is always negative; therefore, we must have
      that \(x+1 \leq 0\) and conclude that the inequality is satisfied only for
      \(x \leq -1\).
    \end{description}
    The two relevant curves for this inequality are plotted below with the
    appropriate domain marked in red along the \(x\)-axis:
    \begin{center}
      \begin{tikzpicture}
        \begin{axis}[
            width=\linewidth,
            height=0.7\linewidth,
            axis lines=middle, 
            xlabel=\(x\),
            ylabel=\(y\),
            xlabel style={at={(ticklabel* cs:1)},anchor=west},
            ylabel style={at={(ticklabel* cs:1)},anchor=south},
            clip=false,
            domain=-5:10,
            samples=501,
            restrict y to domain=-10:16,
            clip=false,
          ]

          \addplot [blue] {6/(x - 5)} 
                  node [above, pos=0.95, font=\footnotesize] {\(y=\dfrac{6}{x-5}\)};
          \addplot [latex-latex] {x} 
                  node[anchor=west, pos=1, font=\footnotesize]{\(y=x\)};
          \draw [dashed, latex-latex] 
                (5,\pgfkeysvalueof{/pgfplots/ymin}) -- (5, \pgfkeysvalueof{/pgfplots/ymax})
                node [pos=0.05, below, sloped, font=\footnotesize] {\(x=5\)};

          \fill [blue] (-1, -1) circle [radius=2pt]
                      node [anchor=north, font=\footnotesize] {\((-1, -1)\)};
          \fill [blue] (6, 6) circle [radius=2pt]
                    node [anchor=west, font=\footnotesize] {\((6, 6)\)};

          \draw [-latex, red, very thick] (-1, 0) -- (\pgfkeysvalueof{/pgfplots/xmin}, 0);
          \draw [red, very thick] (5, 0) -- (6, 0);
          \fill [black] (-1, 0) circle [radius=2pt];
          \draw [draw=black, fill=white] (5, 0) circle [radius=2pt];
          \fill [black] (6, 0) circle [radius=2pt];
        \end{axis}
      \end{tikzpicture}
    \end{center}
  \end{solution}

\end{enumerate}
\end{document}

saída

Versão 2: linha numérica no topo

Se você deseja separar a reta numérica do eixo (como pretende na pergunta original), basicamente acertou:

\begin{center}
  \begin{tikzpicture}
    \begin{axis}[
        name=plot1,
        width=\linewidth,
        height=11em,
        axis x line=middle, 
        axis y line=none,
        clip=false,
        domain=-5:10,
        axis line style={latex-latex},
      ]
      \addplot [draw=none] {0};

      \draw [-latex, red, very thick] (-1, 0) -- (\pgfkeysvalueof{/pgfplots/xmin}, 0);
      \draw [red, very thick] (5, 0) -- (6, 0)
            node [above, pos=0] {\(5\)}
            node [above, pos=1] {\(6\)};
      \fill [black] (-1, 0) circle [radius=2pt]
            node [red, above] {\(-1\)};
      \draw [draw=black, fill=white] (5, 0) circle [radius=2pt];
      \fill [black] (6, 0) circle [radius=2pt];
    \end{axis}
    \begin{axis}[
        at=(plot1.south),
        anchor=north,
        width=\linewidth,
        height=0.7\linewidth,
        axis lines=middle, 
        xlabel=\(x\),
        ylabel=\(y\),
        xlabel style={at={(ticklabel* cs:1)},anchor=west},
        ylabel style={at={(ticklabel* cs:1)},anchor=south},
        clip=false,
        domain=-5:10,
        samples=501,
        restrict y to domain=-10:16,
        clip=false,
      ]

      \addplot [blue] {6/(x - 5)} 
              node [above, pos=0.95, font=\footnotesize] {\(y=\dfrac{6}{x-5}\)};
      \addplot [latex-latex] {x} 
              node[anchor=west, pos=1, font=\footnotesize]{\(y=x\)};
      \draw [dashed, latex-latex] 
            (5,\pgfkeysvalueof{/pgfplots/ymin}) -- (5, \pgfkeysvalueof{/pgfplots/ymax})
            node [pos=0.05, below, sloped, font=\footnotesize] {\(x=5\)};

      \fill [blue] (-1, -1) circle [radius=2pt]
                  node [anchor=north, font=\footnotesize] {\((-1, -1)\)};
      \fill [blue] (6, 6) circle [radius=2pt]
                node [anchor=west, font=\footnotesize] {\((6, 6)\)};
    \end{axis}
  \end{tikzpicture}
\end{center}

saída

Notas extras

Primeiramente tomei a liberdade de limpar seu exemplo e utilizar ambientes como o enumerate, descriptione criei um solutionambiente para cuidar da formatação para você automaticamente. Embora tenha \texbf{1) }e \vskip1emtrabalhe, não é realmente a melhor maneira de usar o LaTeX. Você deve escrever o que vocêsignificarem vez de escrever o que você querver. Ou seja, em vez de \textbf{1) }, \textbf{2) }, tenha uma lista enumerada; e em vez de \textbf{Solution: } ... \rule{1.5ex}{1.5ex}, tenha um {solution}ambiente.

A vantagem de escrever o que vocêsignificaré que se você quiser mudar a aparência das soluções, poderá fazê-lo em um só lugar, em vez de ter que percorrer todo o documento e alterar cada instância.

Algumas outras pequenas coisas:

  • Por alguma razão, o {axis}ambiente parece exigir pelo menos um \addplotcomando. Suspeito que seja porque é necessário calcular o intervalo de ambos os eixos, mesmo que xmin, xmax, ymine ymaxestejam todos especificados. Como não quero traçar nada para a reta numérica, usei \addplot [draw=none] {0};. Não consigo encontrar nenhuma menção a esse requisito na documentação do PGFplots.
  • Quando o PGFplots calcula o posicionamento de todos os rótulos, parece exigir uma altura mínima. Ao desenhar a reta numérica, inicialmente usei a height=0pt, mas isso resultou em erros, então usei height=11em. Isso tem o benefício adicional de não precisar mais ajustar a plot1.southcoordenada, pois a altura vertical da linha de base é suficiente.
  • Em vez de declarar samplese domaina cada \addplotchamada, declaro essas propriedades para todo o eixo. Isso torna o código um pouco mais limpo e também garante que todos os gráficos sejam desenhados em todo o domínio (por exemplo, prefiro que a linha não y=xpare no meio). Se esse for o comportamento pretendido, o have \addplot [domain=-5:0] {x};substituirá o axis-wide domain.
  • Semelhante à nota anterior, ter restrict y to domainnas {axis}opções faz com que essa alteração funcione para todos os \addplotcomandos naquele ambiente. Além disso, restrict y to domaindescarta pontos que estão fora do domínio especificado. Você não precisa plotar 6 / (5-x)em duas \addplotchamadas separadas porque qualquer valor que fique fora do especificadosimdomínio são automaticamente descartados.
  • Com relação aos dois pontos anteriores, pense domainnas restrict y to domainconfigurações da porta de visualização geral para todo o gráfico, e o PGFplots descobrirá o que desenhar.
  • Eu uso \pgfkeysvalueof{/pgfplots/xmin}(e análogo) para obter o valor de xmine yminem ymaxvez de codificá-los. Isso significa que se eu quiser mudar onde osim-axis inicia e para, a linha assíntota será ajustada automaticamente.
  • Em vez de usar \addplotpara desenhar a linha x=5, uso coordenadas explícitas. Isso ocorre principalmente porque achei o comportamento do PGFplots um pouco inconsistente às vezes.
  • Em vez de usar \addplot coordinates{-1,-1};para desenhar um único ponto, usei um dos Ti básicoskComandos Z. Em primeiro lugar, não estamos realmente traçando outra curva, mas sim anotando-a, então \addplotjá não parece o que precisamos. Além disso, ter o comando extra \addplotirá atrapalhar as entradas da legenda e o ciclo de estilo de plotagem, por isso seu plot inicial tinha várias formas e cores, apesar de você não especificá-las.
  • Escolhi width=\linewidthpara que o gráfico preencha a largura da linha atual. Quanto a height=0.7\linewidth, é arbitrário (eu poderia ter usado height=5cm), mas a justificativa para usar \linewidthé que se eu alterar a formatação do documento, a proporção da largura e altura do gráfico permanece a mesma e é sempre garantido que ocupará a largura da linha. Quanto ao 0.7em particular, eu normalmente uso 0.62porque garante que o enredo siga oproporção áurea, mas no caso particular deste gráfico achei que parecia um pouco achatado, então usei 0.7.

informação relacionada