在同一张 Tikz 图片中结合 pgfplots 和其他形状

在同一张 Tikz 图片中结合 pgfplots 和其他形状

我想将 pgf 图和其他 tikz 元素放在同一个图中,但我无法确定图的高度和宽度,以便我可以缩放其他元素。这是一个例子。如您所见,我可以添加元素,但通过或多或少随机地尝试值找到了正确的大小。

\documentclass[11pt]{minimal}
\usepackage{tikz}
\usepackage{xcolor}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ymin=0, ymax=20,
xmin=0, xmax=8,
 every axis y label/.style={
    at={(ticklabel* cs:1.05)},
    anchor=south west,
},
ytick={0,5,11,15,20},
yticklabels={0,5,\textcolor{blue}{$\pi_e^s$},\textcolor{red}{$\pi_e^p$},20},
]
\addplot[mark=x, blue, very thick, domain=0:8] {7*sin(x*90)+10};
\end{axis}
\draw [->, red] (7.5,0) -- (7.5, 5.7) node[midway, right]{\textcolor{red}{foo}};
\end{tikzpicture}
\end{document}

结果图如下:

在此处输入图片描述

答案1

在 axis 环境中,您可以访问各种描述轴的坐标系。例如,坐标系xticklabel* csyticklabel* cs会告诉您 x 轴和 y 轴的位置。问题是:环境\draw中的所有内容axis都会被剪切到绘图的边界处。

幸运的是,你可以传递给一个特殊选项,axis称为after end axis/.code。你添加的任何代码都会在剪辑之后执行,但在轴的范围内,也就是说,你可以获得有关轴环境的所有信息。

下面的代码用于|-组合x一个节点的坐标(来自 x 轴)和y第二个节点的坐标(位于 y 轴上)。

\begin{tikzpicture}
\begin{axis}[
ymin=0, ymax=20,
xmin=0, xmax=8,
 every axis y label/.style={
    at={(ticklabel* cs:1.05)},
    anchor=south west,
},
ytick={0,5,11,15,20},
yticklabels={0,5,\textcolor{blue}{$\pi_e^s$},\textcolor{red}{$\pi_e^p$},20},
after end axis/.code={
      \node(boxtop) at (yticklabel* cs:1)  {};
      \node(boxbottom) at (yticklabel* cs:0)  {};
      \node(rightofbox) at (xticklabel* cs:1.05)  {};
      \draw [->, red] (boxbottom -| rightofbox) -- (boxtop -| rightofbox) node[midway, right]{\textcolor{red}{bar}};
      }
]
\addplot[mark=x, blue, very thick, domain=0:8] {7*sin(x*90)+10};
\end{axis}
\end{tikzpicture}

最终结果

答案2

axis环境关闭后,其范围可在周围环境中tikzpicture作为预定义节点访问,称为current axis。因此,可以使用此节点上的锚点添加轴外的任何注释,例如current axis.south east等。

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
  ymin=0, ymax=20,
  xmin=0, xmax=8,
  every axis y label/.style={
    at={(ticklabel* cs:1.05)},
    anchor=south west,
  },
  ytick={0,5,11,15,20},
  yticklabels={0,5,\textcolor{blue}{$\pi_e^s$},\textcolor{red}{$\pi_e^p$},20},
]
  \addplot[mark=x, blue, very thick, domain=0:8] {7*sin(x*90)+10};
\end{axis}
\draw[->, red] (current axis.south east) ++(0.5,0) coordinate (tmp) -- 
  (tmp |- current axis.north east) node[midway, right]{\textcolor{red}{foo}};
\end{tikzpicture}
\end{document}

在此处输入图片描述

也可以看看:为什么要避免使用最小类?并且,显式地加载xcolortikz不必要的,并且可能会导致选项冲突。

相关内容