附录

附录

我想使用 \foreach 绘制多个图,其中包含 2 个变量输入,一个用于传递变化参数,另一个用于传递图的颜色。我的 MWE 如下。

    \documentclass{article}
    \usepackage{tikz}
    \usepackage{pgfplots}
    \pgfplotsset{compat=newest}
    \usetikzlibrary{arrows,calc,intersections}
    \newcommand{\V}{\widetilde{V}}
    \usepackage{siunitx}
    \usepackage{color}
     \begin{document}
    \begin{figure}[!htbp]
    \centering
    \begin{tikzpicture}
    \begin{semilogxaxis}[axis line style={->,thick},every tick/.style={color=gray},smooth,,xlabel={$\V$ /(\si{\cm \tothe{3}\per\mole})},ylabel={$P$ /bar}, xmin=10,xmax=1e5,ymin=-100,ymax=200,clip=false]
    \def\m{9.864*10^7}%a
    \def\R{8.314}
    \def\n{45.05}%b
    \foreach \y/\c in {200/red,275/blue,300/green,304/red} {
        \addplot[color=\c,domain=50:1e5] {(\R*\y)/(x-\n) - \m/(\y^0.5*x*(x+\n))};
    \addlegendentry{$T$ = \y \si{\kelvin}}} 

编译只会给出未定义控制序列的错误,或者显示的图没有任何点。任何帮助都将不胜感激。

答案1

使用自定义的cycle list\pgfplotsinvokeforeach不是 的变体\foreach

在此处输入图片描述

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotscreateplotcyclelist{MyColors}{
  red,thick\\
  blue,thick\\
  green,thick\\
  cyan,thick\\
 }
\newcommand{\V}{\widetilde{V}}
\usepackage{siunitx}
\begin{document}
\begin{tikzpicture}
\begin{semilogxaxis}[
    axis line style={->,thick},
    every tick/.style={color=gray},
    smooth,
    xlabel={$\V$ /(\si{\cm \tothe{3}\per\mole})},
    ylabel={$P$ /bar},
    xmin=10,xmax=1e5,
    ymin=-1200,ymax=200, %changed ylim
    cycle list name={MyColors},% use the cycle list defined above
    legend style={legend pos=south east}]
\def\m{9.864*10^7}%a
\def\R{8.314}
\def\n{45.05}%b
\pgfplotsinvokeforeach{200,275,300,304} {
    \addplot +[domain=50:1e5] {(\R*#1)/(x-\n) - \m/(#1^0.5*x*(x+\n))};
    \addlegendentry{$T = \SI{#1}{\kelvin}$} % <-- note that this has changed
} 
\end{semilogxaxis}
\end{tikzpicture}
\end{document}

附录

要使用变浅的单一颜色,您可以使用opacity一个小的计算,例如

\pgfplotsinvokeforeach{200,210,...,300} {
    \addplot [domain=50:1e5,color=blue,very thick,opacity=(#1-180)/300] {(\R*#1)/(x-\n) - \m/(#1^0.5*x*(x+\n))};
    \addlegendentry{$T = \SI{#1}{\kelvin}$} 
}

您使用的数字完全取决于循环变量的值,您希望结果介于 0 和 1 之间。cycle list当然,在这种情况下您不需要。

附录2

或者你可以使用该blue!<number>!white功能,使用代码使颜色从浅蓝色变为蓝色

\pgfplotsforeachungrouped \i in {200,210,...,300} {
        \pgfmathtruncatemacro{\rat}{(\i-180)/1.2}
    \edef\temp{\noexpand
        \addplot [domain=50:1e5,color=blue!\rat!white,very thick]
            {(\R*\i)/(x-\n) - \m/(\i^0.5*x*(x+\n))};
                \noexpand\addlegendentry{$T = \SI{\i}{\kelvin}$}
    }\temp
}

相关内容