我正在绘制一个简单的直线图。实际上,我正在绘制一个模数或绝对函数,但我没有成功,因此使用两个线性图来代替。
我的代码如下:
\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 轴下方被截断了。这是为什么呢?
编辑:
下面是一个可编译的示例,其中列出了我所拥有图表的一些环境:
\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}
现在我只需重新调整轴标签。