我有这个pgfplots
图,我想让每个图都有不同的颜色。从红色到蓝色或其他颜色的渐变(m=2
应该是red
,m=11
应该是blue
,其他颜色m
应该介于这两者之间)。
即使我改变图表的数量,我也需要它发挥作用。
我已经尝试过转移这个例子中的代码行,但是无法让它工作:绘制包含多个参数值的图形
下面添加了最小工作示例。
谢谢。
\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{
gainplot/.style={
axis x line*=box,
xmax=10,
xmin=0.1,
xmode=log,
width=14cm,
xlabel=$F_\textup{x}$,
xticklabel style={yshift=-0.2cm,},
xtick={0.1,1.0,10.0},
xticklabels={{$0.1$},{$1.0$},{$10.0$}},
axis y line*=box,
ymax=3,
ymin=0,
ymode=normal,
height=7cm,
ylabel=$K$,
yticklabel style={xshift=-0.2cm,},
ytick={0,1,2,3 },
yticklabels={{$0$},{$1$},{$2$},{$3$}},
grid = both,
grid style={line width=0.2pt,},
legend style={
font=\scriptsize,
at={(0.5,1.03)},
anchor=south,
draw=none,
},
legend columns=5,
},
gainplot/.belongs to family=/pgfplots/scale,
}
\pgfmathdeclarefunction{gaincurve}{2}{%
\pgfmathparse{%
(x^2*(#2-1)/(sqrt((#2*x^2-1)^2+x^2*(x^2-1)^2*(#2-1)^2*#1^2)))
}%
}
\tikzstyle{gaincurvestyle}=[
smooth,
%thick,
mark=none,
domain=0.1:10,
samples=100,
]
\begin{document}
\begin{figure}[]
\centering
\begin{tikzpicture}
\begin{axis}[gainplot]
\foreach \m in {2,3,...,11}{
\addplot[gaincurvestyle,red]{gaincurve(0.2,\m)}; %%% Here help is needed.
\addlegendentryexpanded{$m=\m$}
}
\end{axis}
\end{tikzpicture}
\caption{Placeholder.}
\end{figure}
\end{document}
答案1
您可以使用手册\edef
中提到的技巧pgfplots
,结合evaluate
中的\foreach
和red!<value>!blue
颜色语法。
如果要根据循环的值进行规范化,可以使用
\foreach [evaluate=\m as \redfrac using (\m-<minimum>)*100/(<maximum>-<minimum>)] ...
然后将绘图的颜色设置为red!\redfrac!blue
。例如,如果循环中的最低值为 2,最高值为 11(如您的示例所示),则使用(\m-2)*100/(11-2)
。
如果你想根据循环索引进行规范化,你可以这样做
\foreach [count=\i from 0,evaluate=\i as \redfrac using \i*100/<number of elements in list>)] ...
例如,如果您要循环遍历 15 个值的列表,请使用\i*100/15
。在这两种情况下,都只是将值规范化,使其从 0 到 100。
\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{
gainplot/.style={
axis x line*=box,
xmax=10,
xmin=0.1,
xmode=log,
width=14cm,
xlabel=$F_\textup{x}$,
xticklabel style={yshift=-0.2cm,},
xtick={0.1,1.0,10.0},
xticklabels={{$0.1$},{$1.0$},{$10.0$}},
axis y line*=box,
ymax=3,
ymin=0,
ymode=normal,
height=7cm,
ylabel=$K$,
yticklabel style={xshift=-0.2cm,},
ytick={0,1,2,3 },
yticklabels={{$0$},{$1$},{$2$},{$3$}},
grid = both,
grid style={line width=0.2pt,},
legend style={
font=\scriptsize,
at={(0.5,1.03)},
anchor=south,
draw=none,
},
legend columns=5,
},
gainplot/.belongs to family=/pgfplots/scale,
}
\pgfmathdeclarefunction{gaincurve}{2}{%
\pgfmathparse{%
(x^2*(#2-1)/(sqrt((#2*x^2-1)^2+x^2*(x^2-1)^2*(#2-1)^2*#1^2)))
}%
}
\tikzstyle{gaincurvestyle}=[
smooth,
%thick,
mark=none,
domain=0.1:10,
samples=100,
]
\begin{document}
\begin{figure}[]
\centering
\begin{tikzpicture}
\begin{axis}[gainplot]
\foreach [evaluate=\m as \redfrac using (\m-2)*100/(11-2)] \m in {2,3,...,11}{
\edef\temp{\noexpand\addplot[gaincurvestyle,red!\redfrac!blue]{gaincurve(0.2,\m)};
\noexpand\addlegendentry{$m=\m$}}
\temp
}
\end{axis}
\end{tikzpicture}
\caption{Placeholder.}
\end{figure}
\end{document}