我想画一些东西而不是节点,并认为用 来解决这个问题是一个很好的解决方案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
图片真正有用,你可能不想硬连接x
和y
坐标。相反,你可以定义better statistic
接受逗号分隔的x
和y
坐标列表,这样代码
\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);
}
}
唯一有点棘手的是选择的最大高度x
和y
轴的最大高度。根据您的数据,您可以硬编码这些或像上面一样动态选择它们。
完整代码如下:
\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
或方向上进行缩放。y
xscale
yscale
答案2
另一种方法是使用savebox
es。我相信 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}