我们如何定义 addplot 的自定义变体,包括新键和默认值?

我们如何定义 addplot 的自定义变体,包括新键和默认值?

我经常使用 \addplot 创建图,并使用大量可选参数,这使得很难保持代码的一致性。我有几个重复的绘图样式,因此我尝试实现一个新的宏,可以像这样使用:

\newaddplot[style=mystyle1,draw=red]{mydatafile.txt};

我想保留原始 \addplot 函数的结构和键,并添加新键。我下面的方法使用 pgfkeys 来解析 \newaddplot 的键值对,处理我的新键,并将其余部分传递给 \newaddplot 内的 \addplot 命令。MWE 使用“draw”和“offset”作为现有键和新键的示例。

\documentclass{standalone} 
\usepackage[english]{babel}
\usepackage{pgfplots,pgfkeys}\pgfplotsset{compat=newest}

\begin{document}%

\newcommand\offset{0}        
\pgfkeys{
/newaddplot/.is family, /newaddplot,
default/.style = {offset=0},
offset/.code = {\renewcommand\offset{#1}},
.unknown/.code={
\let\currname\pgfkeyscurrentname
\let\currval\pgfkeyscurrentvalue
\ifx#1\pgfkeysnovalue
\pgfqkeys{/pgfplots}{remainingkeys/.append style/.expand once={\currname}}
\else
\pgfqkeys{/pgfplots}{remainingkeys/.append style/.expand twice={\expandafter\currname\expandafter=\currval}}
\fi
}}    

\newcommand\newaddplot[1][]{
\pgfqkeys{/pgfplots}{remainingkeys/.style={}}% reset remainingkeys
% \pgfplotsextra{ %uncomment here ...
\pgfkeys{/newaddplot,default,#1}%set default values and parse key-value pairs
% } % ... and here fixes colors but ignores offset
\addplot[/pgfplots/remainingkeys] coordinates {(0,0+\offset)(1,1+\offset)} % use parsed keys for plot
}

\begin{tikzpicture}     
    \begin{axis}    
        \newaddplot[draw=red,ultra thick,offset=1];
        \newaddplot[draw=blue,dashed];
    \end{axis}
\end{tikzpicture}  

\end{document}

问题是最后一个 \newaddplot 的属性用于所有图(此处 draw=blue,dashed)。经过一番研究,我发现这是因为“轴内的任何绘图命令都需要推迟到轴完成为止”(pgfplotsmanual 第 8.3 章)。使用 \pgfplotsextra(取消注释 MWE 中的两行)会使用之前指定的所有属性,即第一个图中的“超厚”也应用于第二个图。此外,偏移不再起作用。 带有和不带有 pgfplotsextra 的输出

我如何确保按键只影响相应的情节?

答案1

我想到了一个解决方案,但我无法判断这是否是解决问题的“好方法”。欢迎提出意见。

我没有将未知的键附加到 /pgfplots/remainingkeys,而是使用计数器为每个 \newaddplot 定义单独的样式

诀窍是确保在 pgfplots 开始扫描 \addplot 之前扩展计数器。详细信息可在此处找到

http://www.mrunix.de/forums/archive/index.php/t-75727.html

在 Christian Feuersänger 的回答中。

以下是代码:

\documentclass{standalone} 
\usepackage[english]{babel}
\usepackage{pgfplots,pgfkeys}\pgfplotsset{compat=newest}    

\begin{document}%

\newcommand\offset{0}
\newcounter{newaddplotcounter}    

\pgfkeys{
/newaddplot/.is family, /newaddplot,
default/.style = {offset=0,draw=red},
offset/.code = {\renewcommand\offset{#1}},
.unknown/.code={
\let\currname\pgfkeyscurrentname
\let\currval\pgfkeyscurrentvalue
\ifx#1\pgfkeysnovalue
\pgfqkeys{/pgfplots}{newaddplotstyle no \thenewaddplotcounter/.append style/.expand once={\currname}}
\else
\pgfqkeys{/pgfplots}{newaddplotstyle no \thenewaddplotcounter/.append style/.expand twice={\expandafter\currname\expandafter=\currval}}
\fi
}}        

\newcommand\newaddplot[1][]{
\stepcounter{newaddplotcounter}
\pgfkeys{/newaddplot,default,#1}%set default valuse and parse key-value pairs
\edef\TEMP{\noexpand\addplot[newaddplotstyle no \thenewaddplotcounter] coordinates {(0,0+\offset)(1,1+\offset)}} % use parsed keys for plot    
%\show\TEMP
\TEMP
}  

\begin{tikzpicture}     
    \begin{axis}   
        \setcounter{newaddplotcounter}{-1}
        \newaddplot[offset=1];
        \newaddplot[offset=.5,ultra thick,dashed,draw=green];
        \newaddplot[dashed,draw=red];         
    \end{axis}
\end{tikzpicture}

\end{document}    

结果如下:在此处输入图片描述

相关内容