\foreach 内的 pgfplots \closedcycle 命令返回错误

\foreach 内的 pgfplots \closedcycle 命令返回错误

以下代码演示了这个问题。它可以很好地构建,但如果我添加注释的\closedcycle命令,它就不会构建(未定义的控制序列)。

\documentclass[tikz]{standalone} 
\usepackage{pgfmath}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\usepackage{calc}
\pgfplotsset{compat=newest}
\begin{document} 

\begin{tikzpicture}
  \begin{axis}[
      %title=title,
      %xlabel={xlabel},
      %ylabel={ylabel},
    ]
    \foreach \i/\j in 
      {
        1/red!0!blue,
        2/red!20!blue,
        3/red!40!blue,
        4/red!60!blue,
        5/red!80!blue,
        6/red!100!blue
      }{
      \edef\temp{\noexpand
        \addplot[
          color=\j,
          fill=\j,
          fill opacity=0.05
          ] 
          table 
          {expNum3D2\i1.dat};%\closedcycle;
      }
      \temp
    }
  \end{axis}
\end{tikzpicture}

\end{document}

如果没有\closedcycle,它看起来像: 无闭式循环

但是,我希望填充到轴上。

附加询问 我费了好大劲才用编程的方式构建我循环的数组。我希望能够设置绘图的数量\n,并创建数组,包括从blue到的颜色混合red。任何帮助都将不胜感激!

答案1

当使用扩展定义 ( \edef) 来构造循环时,您需要保护不应扩展的命令,\noexpand就像您对\addplot命令所做的那样。因此,\closedcycle您不应该只使用 ,而应该使用\noexpand\closedcycle

但是,对于此应用程序,您甚至不需要跳过所有的\edef环节\noexpand:您可以使用键定义颜色列表cycle list,然后使用“正常”\foreach循环:

\documentclass{standalone} 
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document} 

\begin{tikzpicture}
  \begin{axis}[
      cycle list={
        red!0!blue, fill=red!0!blue\\
        red!20!blue, fill=red!20!blue\\
        red!40!blue, fill=red!40!blue\\
        red!60!blue, fill=red!60!blue\\
        red!80!blue, fill=red!80!blue\\
        red!100!blue, fill=red!100!blue\\
      }
    ]
    \foreach \i in 
      {1,...,6}{
      \addplot +[fill opacity=0.05] 
          {cos(deg(x/3))+rand/5+\i/5} \closedcycle;
    }
  \end{axis}
\end{tikzpicture}
\end{document}

回答第二个问题:您可以使用颜色图,它在两种(或更多种)颜色之间进行线性插值。要在不绘制边框的情况下填充图和轴之间,可以使用以下库fillbetween

\documentclass[border=5mm]{standalone} 
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{fillbetween}
\usepackage{filecontents}

\begin{filecontents}{data1.dat}
0 0.6
1 2.2
\end{filecontents}
\begin{filecontents}{data2.dat}
0 0.4
1 1.8
\end{filecontents}
\begin{filecontents}{data3.dat}
0 0.2
1 1.4
\end{filecontents}
\begin{filecontents}{data4.dat}
0 0
1 1
\end{filecontents}



\begin{document} 
\def\numberOfPlots{4}
\pgfplotsset{
/pgfplots/colormap={bluered}{color=(blue) color=(red)}
}

\begin{tikzpicture}
  \begin{axis}
  \addplot [draw=none, name path=axis, domain=0:1] {0};
    \pgfplotsinvokeforeach{1,...,\numberOfPlots}{
      \pgfplotscolormapfind[1:\numberOfPlots]{#1}{bluered}
      \definecolor{mycolor#1}{rgb}{\pgfmathresult}
      \addplot [draw=mycolor#1, name path=plot#1] table {data#1.dat};
      \addplot [mycolor#1, fill opacity=0.2] fill between[of=plot#1 and axis];
    }
  \end{axis}
\end{tikzpicture}
\end{document}

相关内容