我想绘制一个分段常数函数,像那个最小例子一样:
你好,我想绘制一个分段常数函数,像那个最小例子一样:
\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenx}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{pgfplotstable}
\usepackage{xcolor}
% read variables from file
\usepackage{readarray}
\usepackage{filecontents}
\begin{document}
% Define the file in here
\begin{filecontents*}{val.ssv}
0.25 0.5 0.75
\end{filecontents*}
\begin{filecontents*}{xval.ssv}
0.2 0.4 0.6 0.8
\end{filecontents*}
% read values from the file
\readdef{val.ssv}{\valdef}
\readArrayij{\valdef}{val}{1}
\readdef{xval.ssv}{\xvaldef}
\readArrayij{\xvaldef}{xval}{1}
\begin{tikzpicture}[font=\large]
\begin{axis}[%
width=10cm,
height=7cm,
xmin=0,
xmax=1,
xmajorgrids,
ymin=0,
ymax=1,
]
%\foreach \i in {1,...,3}
%{
% \addplot [solid, color=black] table[row sep=crcr]{%
% \arrayij{xval}{\i}{1} \arrayij{val}{\i}{1}\\
% \arrayij{xval}{\i}{1} \arrayij{val}{\i}{1}\\
% \arrayij{xval}{\i+1}{1} \arrayij{val}{\i}{1}\\
% };}
\addplot [solid, color=black] table[row sep=crcr]{%
\arrayij{xval}{1}{1} \arrayij{val}{1}{1}\\
\arrayij{xval}{1}{1} \arrayij{val}{1}{1}\\
\arrayij{xval}{2}{1} \arrayij{val}{1}{1}\\
};
\addplot [solid, color=black] table[row sep=crcr]{%
\arrayij{xval}{2}{1} \arrayij{val}{2}{1}\\
\arrayij{xval}{2}{1} \arrayij{val}{2}{1}\\
\arrayij{xval}{3}{1} \arrayij{val}{2}{1}\\
};
\addplot [solid, color=black] table[row sep=crcr]{%
\arrayij{xval}{3}{1} \arrayij{val}{3}{1}\\
\arrayij{xval}{3}{1} \arrayij{val}{3}{1}\\
\arrayij{xval}{4}{1} \arrayij{val}{3}{1}\\
};
\end{axis}
\end{tikzpicture}
\end{document}
\addplot
我不想多次使用 -command,而是想使用\foreach
-loop,就像上面最小示例中的注释行一样。不幸的是,调用\arrayij{xval}{\i+1}{1}
不起作用。有人知道我必须做什么才能让它起作用吗?
\addplot
我不想多次使用 -command,而是想使用\foreach
-loop,就像上面最小示例中的注释行一样。不幸的是,调用\arrayij{xval}{\i+1}{1}
不起作用。有人知道我必须做什么才能让它起作用吗?
答案1
使用 V2.0 的语法readarray
(而不是已弃用的 V1.x)要容易得多。此外,解决用例中数组使用问题的关键是引入\the\numexpr
求值\i+1
。
编辑以听取薛定谔的猫的评论建议,谁知道呢pgfplots
(我不知道)。谢谢你的建议。
\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenx}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{pgfplotstable}
\usepackage{xcolor}
% read variables from file
\usepackage{readarray}
\usepackage{filecontents}
\begin{document}
% Define the file in here
\begin{filecontents*}{val.ssv}
0.25 0.5 0.75
\end{filecontents*}
\begin{filecontents*}{xval.ssv}
0.2 0.4 0.6 0.8
\end{filecontents*}
% read values from the file
\readdef{val.ssv}\valdef
\readarray\valdef\val[-,1]
\readdef{xval.ssv}\xvaldef
\readarray\xvaldef\xval[-,1]
\begin{tikzpicture}[font=\large]
\begin{axis}[%
width=10cm,
height=7cm,
xmin=0,
xmax=1,
xmajorgrids,
ymin=0,
ymax=1,
]
\foreach \i in {1,...,3}
{
\edef\temp{\noexpand\addplot [solid, color=black] table[row sep=crcr]{%
\xval[\i,1] \val[\i,1]\\
\xval[\the\numexpr\i+1\relax,1] \val[\i,1]\\ };
}
\temp}
\end{axis}
\end{tikzpicture}
\end{document}
注意:此代码与 OP 的 MWE 输出匹配,即使他/她发布的图像不匹配。
我还要指出的是,由于您的数据数组是一维的,因此您可以在读取文件后使用嵌入式包的功能listofitems
来执行该过程(这里您甚至不需要\numexpr
.
\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenx}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{pgfplotstable}
\usepackage{xcolor}
% read variables from file
\usepackage{readarray}
\usepackage{filecontents}
\begin{document}
\setsepchar{ }
% Define the file in here
\begin{filecontents*}{val.ssv}
0.25 0.5 0.75
\end{filecontents*}
\begin{filecontents*}{xval.ssv}
0.2 0.4 0.6 0.8
\end{filecontents*}
% read values from the file
\readdef{val.ssv}\valdef
\readlist\val{\valdef}
\readdef{xval.ssv}\xvaldef
\readlist\xval{\xvaldef}
\begin{tikzpicture}[font=\large]
\begin{axis}[%
width=10cm,
height=7cm,
xmin=0,
xmax=1,
xmajorgrids,
ymin=0,
ymax=1,
]
\foreach \i in {1,...,3}
{
\edef\temp{\noexpand\addplot [solid, color=black] table[row sep=crcr]{%
\xval[\i] \val[\i]\\
\xval[\i+1] \val[\i]\\ };
}
\temp}
\end{axis}
\end{tikzpicture}
\end{document}