以下代码演示了这个问题。它可以很好地构建,但如果我添加注释的\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}