Tikz:\foreach 和 axis 环境不兼容

Tikz:\foreach 和 axis 环境不兼容

我正在尝试使用 TikZ 绘制图形。我有几个 .txt 文件,其中包含要绘制的曲线的坐标,列表如下

file2.txt, 
file4.txt,
...
file30.txt

我想\plot在轴环境中将它们与文件一起添加。此外,我想为它们添加不同的颜色,创建阴影效果,比如从蓝色到红色。

简而言之,我想创建一种轮廓图,但由于我没有 3D 功能,所以我必须导入坐标。

我编写了此代码,其中我在 中使用了两个变量\foreach,一个用于文件名 \x,另一个用于颜色阴影 \y(参见“原始想法”行)。由于 \foreach 和轴环境之间存在某种问题,它无法正常工作。

我考虑过其他选择,比如阐明 \x 和 \y 之间的关系(参见代码行),使用\pgfplotsinvokeforeach或其他技巧,\edef但由于不同的原因它们不起作用:

  • 如果我明确说明关系,它似乎不想计算 3*\x (未定义的控制序列)

  • 上面\pgfplotsinvokeforeach写着“非法计量单位”

  • 同样\edef

我阅读了一些关于使用\pgfplotsinvokeforeach和技巧的主题,\edef但可能我还没有正确理解如何在我的代码中使用它们。

你能给我一个解决方案吗?如果你能针对我提出的所有 4 种可能情况给出更正,那就更好了 :-)

以下是代码

\documentclass{article}
\usepackage{pgf,pgfsys,pgffor}
\usepackage{pgfplots}
\usepackage{tikz}

\begin{document}

\begin{figure}
    \begin{tikzpicture} 
    \newcommand{\filename}{./figure/regionDep0/orthogonal}
    \begin{axis}[
        xmin=0, xmax=1, ymin=0, ymax=1, width=8cm, height=8cm]
        % Original idea: not working
        \foreach \x/\y in {2/0,4/7,...,30/98}
        {
            \plot[color=blue!\y!red] file {\filename \x.txt};
        }
%   
%       % substituting \y as function of \x: not working
%       \foreach \x in {2,4,...,30}
%       {
%           \plot[color=blue!3*\x!red] file {\filename \x.txt};
%       }
%       
%       % Trying with \pgfplotsinvokeforeach: not working
%       \pgfplotsinvokeforeach{2,4,...,30}
%       {
%       \plot [color=blue!3*#1!red] file {\filename #1.txt};
%       }
%
%       %   Trying with \edef\temp{...}: not working
%       \foreach \x/\y in {2/0,4/7,...,30/98}
%       {
%           \edef\temp{\noexpand\plot [color=blue!\y!red] file {\filename \x.txt};}
%           \temp
%       }       
        \end{axis}
    \end{tikzpicture}
\end{figure}

\end{document}

答案1

如果您正在使用axisPGFPlots 包提供的环境,则应该使用\addplot而不是\plot

要为每个图使用不同的颜色,一种选择可能是将mesh绘图类型与point meta=explicit和一起使用meta expr=\i。这样就可以使用颜色图,而不限于colorA!<value>!colorB表达式:

\documentclass{article}
\usepackage{pgfplots}  % Loads all required packages automatically
\usepackage{filecontents}
\begin{filecontents*}{file1.txt}
0 0
1 1
2 2
3 1
4 0
\end{filecontents*}
\begin{filecontents*}{file2.txt}
0 1
1 3
2 5
3 3
4 1
\end{filecontents*}
\begin{filecontents*}{file3.txt}
0 2
1 5
2 7
3 5
4 2
\end{filecontents*}

\begin{document}

\begin{figure}
    \begin{tikzpicture} 
    \newcommand{\filename}{file}
    \begin{axis}[
            colormap/bluered
        ]
        \foreach \i in {1,2,3}
        {
            \addplot +[thick, no markers, mesh, point meta=explicit] table [meta expr=\i] {\filename \i.txt};
        }   
        \end{axis}
    \end{tikzpicture}
\end{figure}

\end{document}

或者(可能更好),contour prepared如果将所有轮廓放入一个文件中,则可以使用绘图样式。这样,您甚至可以在轮廓上获得标签(当然,可以调整或关闭标签):

\documentclass{article}
\usepackage{pgfplots}  % Loads all required packages automatically
\pgfkeys{/pgf/number format/relative round mode=fixed}
\usepackage{filecontents}
\begin{filecontents*}{contours.txt}
0 0 0
1 1 0
2 2 0
3 1 0
4 0 0

0 1 1
1 3 1
2 5 1
3 3 1
4 1 1

0 2 2
1 5 2
2 7 2
3 5 2
4 2 2
\end{filecontents*}

\begin{document}

\begin{figure}
    \begin{tikzpicture} 
    \newcommand{\filename}{file}
    \begin{axis}
    \addplot [contour prepared] table {contours.txt};
        \end{axis}
    \end{tikzpicture}
\end{figure}

\end{document}

相关内容