PGFPlots 中的限制域会产生错误结果

PGFPlots 中的限制域会产生错误结果

我正在绘制一个简单的直线图。实际上,我正在绘制一个模数或绝对函数,但我没有成功,因此使用两个线性图来代替。

我的代码如下:

\pgfkeys{/pgfplots/axis labels at tip/.style={
 xlabel style={at={(current axis.right of origin)}, yshift=1.5ex, anchor=north},
 ylabel style={at={(current axis.above origin)}, xshift=1.5ex, anchor=east}}
 }
 
 \begin{minipage}[t]{0.42\columnwidth}
   \begin{tikzpicture}
     \begin{axis}[
       xmin=-2, xmax=3,
       ymin=-4, ymax=6,
       scale only axis=true,
       scale=0.4,
       domain=-2:3,
       axis lines=middle,
       samples=500,
       xtick=\empty,
       ytick=\empty,
       ylabel={$y$},
       xlabel={$x$},
       axis labels at tip,
      ]
  \end{axis}
      \addplot [maincolor,restrict y to domain={0:6} ] { 2*x - 2};
\end{tikzpicture}

\end{迷你页面}

这是错误的结果

限制线性图的范围,使图在 x 轴处被切断,会产生错误

我尝试过在 x 轴处截断图表。但是图表在 x 轴下方被截断了。这是为什么呢?

编辑:

下面是一个可编译的示例,其中列出了我所拥有图表的一些环境:

\documentclass{article}

\usepackage{multicol}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{ninecolors}
\usepackage{environ}

\colorlet{maincolor}{violet5}

% Define boxes
\tikzstyle{mybox} = [draw=maincolor, fill=white, very thick,
rectangle, rounded corners, inner sep=10pt, inner ysep=10pt]
\tikzstyle{fancytitle} =[fill=maincolor, text=white, rounded corners, font=\bfseries]

\NewEnviron{chbox}[1]
{
    \begin{tikzpicture}
      \node [mybox] (box){%
      \minipage{0.3\textwidth}
      \fontsize{7pt}{8pt}\selectfont
      \BODY
      \par
      \endminipage
     };
 \node[fancytitle, right=10pt] at (box.north west) { #1 };
 \end{tikzpicture}
}

\pgfkeys{/pgfplots/axis labels at tip/.style={
     xlabel style={at={(current axis.right of origin)}, yshift=1.5ex,  anchor=north},
     ylabel style={at={(current axis.above origin)}, xshift=1.5ex,  anchor=east}}
 }

\begin{document}

    \begin{multicols*}{3}

       \begin{chbox}{Example}
           \begin{minipage}[t]{0.42\columnwidth}
               \begin{tikzpicture}
                  \begin{axis}[
                     xmin=-2, xmax=3,
                     ymin=-4, ymax=6,
                     scale only axis=true,
                     scale=0.4,
                     domain=-2:3,
                     axis lines=middle,
                     samples=500,
                     xtick=\empty,
                     ytick=\empty,
                     ylabel={$y$},
                     xlabel={$x$},
                     axis labels at tip,
                   ]
                   \addplot [maincolor,restrict y to domain={0:6} ] { 2*x - 2};
                  \end{axis}
                 \end{tikzpicture}
                \end{minipage}
               \end{chbox}  
              \end{multicols*}

            \end{document}

事实证明,似乎是我在绘图周围设置的方框导致了错误。如果我移除方框,它会在 x 轴处完美截断。

问题是,我需要这些盒子。

带包装盒:

有盒子

无包装盒:

在此处输入图片描述

答案1

您可以使用该fit库来避免tikzpicture容易导致对齐问题的嵌套:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{fit}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\usepackage{ninecolors}
\usepackage{environ}

\colorlet{maincolor}{violet5}

\tikzset{
    mybox/.style={
        draw=maincolor, very thick, rectangle, rounded corners, inner sep=10pt, inner ysep=10pt
    },
    fancytitle/.style={
        fill=maincolor, text=white, rounded corners, font=\bfseries
    },
    /pgfplots/axis labels at tip/.append style={
        xlabel style={
            at={(current axis.right of origin)}, yshift=-1.5ex, anchor=north
        },
        ylabel style={
            at={(current axis.above origin)}, xshift=-1.5ex, anchor=east
        }
    }
}

\NewEnviron{chbox}[1]{
    \begin{tikzpicture}[font={\fontsize{7pt}{8pt}\selectfont}]
        \BODY
        \node[mybox, fit={(current bounding box.north east) (current bounding box.south west)}] (box) {};
        \node[fancytitle, right=10pt] at (box.north west) {#1};
    \end{tikzpicture}
}

\begin{document}

    \begin{chbox}{Example}
        \begin{axis}[
            xmin=-2, xmax=3,
            ymin=-4, ymax=6,
            scale only axis=true,
            scale=0.4,
            domain=-2:3,
            axis lines=middle,
            samples=500,
            xtick=\empty,
            ytick=\empty,
            ylabel={$y$},
            xlabel={$x$},
            axis labels at tip,
        ]
        \addplot[maincolor, restrict y to domain={0:6}] {2*x - 2};
        \end{axis}
    \end{chbox}  

\end{document}

在此处输入图片描述

答案2

我找到了解决这个问题的方法。

问题似乎出在 pgfplot 嵌入了两个 tikzpicture 中,一个用于框,一个用于实际绘图。当发生这种情况时,坐标可能会发生一些变化。

因此我使用了 savebox,它在 tikzpicture 之前对其进行一次排版,然后将其转储进去。

如果有人能告诉我为什么坐标会变得混乱,以及是否有一种在 tikz 和 pgfplots 中执行此操作的更自然的方法,而不是使用保存盒,我仍然会很感激。

我的解决方法:

\newsavebox\mybox

\begin{lrbox}{\mybox}
 \begin{tikzpicture}
   \begin{axis}[
     xmin=-2, xmax=3,
     ymin=-4, ymax=6,
     scale only axis=true,
     scale=0.4,
     domain=-2:3,
     axis lines=middle,
     samples=500,
     xtick=\empty,
     ytick=\empty,
     ylabel={$y$},
     xlabel={$x$},
     axis labels at tip,
    ]
    \addplot [maincolor,restrict y to domain={0:6} ] { 2*x - 2};
\end{axis}
\end{tikzpicture}
\end{lrbox}

\begin{chbox}{Example}
  \begin{minipage}[t]{0.42\columnwidth}
    \usebox\mybox
  \end{minipage}
\end{chbox}

固定的

现在我只需重新调整轴标签。

相关内容