如何将 tikzpicture 绘制为节点?

如何将 tikzpicture 绘制为节点?

我想画一些东西而不是节点,并认为用 来解决这个问题是一个很好的解决方案tikzset。但它不起作用。我也读过

\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{xcolor}

\tikzset{statistic/.pic={
    \draw[line width=1] (0,2) -- (0,0) -- (2,0);
    \draw[line width=2,color=ProcessBlue] (0.4,0.1) -- (0.4,1);
    \draw[line width=2,color=ProcessBlue] (1,0.1) -- (1,1);
    \draw[line width=2,color=ProcessBlue] (1,0.1) -- (1,1.5);
    \draw[line width=2,color=ProcessBlue] (1.6,0.1) -- (1.6,1.9);
}}

然后我想用这个命令来使用它:

\statistic at (0,0) {};

我还看到它\tikzset已被弃用。那么用 or 来解决这个问题会更好吗\pgfplotsset

答案1

有几种不同的使用方法,pic包括:

\begin{tikzpicture}
  \pic at (0,0) {statistic};
  \draw (4,0) pic{statistic};
\end{tikzpicture}

生成结果:

在此处输入图片描述

话虽如此,如果你想让statistic图片真正有用,你可能不想硬连接xy坐标。相反,你可以定义better statistic接受逗号分隔的xy坐标列表,这样代码

\begin{tikzpicture}
  \pic at (0,0) {better statistic={0.4/1, 1/1, 1.6,1.9}};
  \draw (4,0) pic{better statistic={0.4/1, 1/1, 1.6,1.9, 2.1, 0.4, 2.4, 3.2}};
\end{tikzpicture}

生产

在此处输入图片描述

这很容易做到,因为pic可以接受一个参数(事实上,使用稍微不同的语法,它可以接受多个参数),所以你可以#1通过定义来循环遍历坐标

\tikzset{better statistic/.pic={
    \def\xmax{1.5}
    \def\ymax{1.5}
    \foreach \x/\y in {#1} {
      \draw[line width=2,color=blue] (\x,0.1) -- ++(0,\y);
      \pgfmathparse{max(\x,\xmax)}\xdef\xmax{\pgfmathresult}
      \pgfmathparse{max(\y,\ymax)}\xdef\ymax{\pgfmathresult}
    }
    \draw[line width=1] (0,\ymax+0.5) -- (0,0) -- (\xmax+0.5,0);
  }
}

唯一有点棘手的是选择的最大高度xy轴的最大高度。根据您的数据,您可以硬编码这些或像上面一样动态选择它们。

完整代码如下:

\documentclass{article}

\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{xcolor}

\tikzset{statistic/.pic={
    \draw[line width=1] (0,2) -- (0,0) -- (2,0);
    \draw[line width=2,color=blue] (0.4,0.1) -- (0.4,1);
    \draw[line width=2,color=blue] (1,0.1) -- (1,1);
    \draw[line width=2,color=blue] (1,0.1) -- (1,1.5);
    \draw[line width=2,color=blue] (1.6,0.1) -- (1.6,1.9);
  }
}


\tikzset{better statistic/.pic={
    \def\xmax{1.5}
    \def\ymax{1.5}
    \foreach \x/\y in {#1} {
      \draw[line width=2,color=blue] (\x,0.1) -- ++(0,\y);
      \pgfmathparse{max(\x,\xmax)}\xdef\xmax{\pgfmathresult}
      \pgfmathparse{max(\y,\ymax)}\xdef\ymax{\pgfmathresult}
    }
    \draw[line width=1] (0,\ymax+0.5) -- (0,0) -- (\xmax+0.5,0);
  }
}

\begin{document}

  \begin{tikzpicture}
    \pic at (0,0) {statistic};
    \draw (4,0) pic{statistic};
  \end{tikzpicture}

  \bigskip

  \begin{tikzpicture}
    \pic at (0,0) {better statistic={0.4/1, 1/1, 1.6,1.9}};
    \draw (4,0) pic{better statistic={0.4/1, 1/1, 1.6,1.9, 2.1, 0.4, 2.4, 3.2}};
  \end{tikzpicture}

\end{document}

ps 顺便说一句,\tikzset这是这里推荐使用的命令。有一个较旧的\tikzstyle命令已被弃用。

编辑

要重新缩放这些图表,正如评论中所要求的,有两种简单的方法可以做到这一点:

使用以下方法重新调整整个tikzpicture环境:

\begin{tikzpicture}[scale=0.5]
  \pic at (0,0) {better statistic={0.4/1, 1/1, 1.6,1.9}};
\end{tikzpicture}

使用以下方法重新调整个体pic

\begin{tikzpicture}
  \pic[scale=0.5] at (0,0) {better statistic={0.4/1, 1/1, 1.6,1.9}};
\end{tikzpicture}

您还可以分别使用和在x或方向上进行缩放。yxscaleyscale

答案2

另一种方法是使用saveboxes。我相信 asavebox是作为 PDF 驱动程序的低级命令实现的,而 apic是作为低级 PGF 命令实现的(如\pgfpathmoveto\pgfpathlineto)。不过,这只是猜测。

\documentclass{standalone}
\usepackage{tikz}
%\usepackage{pgfplots}
\usepackage{xcolor}

\newsavebox{\tempbox}
\savebox\tempbox{\begin{tikzpicture}
    \draw[line width=1] (0,2) -- (0,0) -- (2,0);
    \draw[line width=2,color=ProcessBlue] (0.4,0.1) -- (0.4,1);
    \draw[line width=2,color=ProcessBlue] (1,0.1) -- (1,1);
    \draw[line width=2,color=ProcessBlue] (1,0.1) -- (1,1.5);
    \draw[line width=2,color=ProcessBlue] (1.6,0.1) -- (1.6,1.9);
\end{tikzpicture}}

\begin{document}
\usebox\tempbox
\begin{tikzpicture}
  \node[inner sep=0pt] {\usebox\tempbox};
\end{tikzpicture}

\end{document}

相关内容