假设我们有一个data.csv
函数数据,形式为两列:x 和 f(x),例如,
x f
0 3
0.25 2
0.5 2
0.75 0
1 1
在 TikZ 中,它的默认表示形式\addplot
是分段线性函数,通过线段连接每连续两个点:
\addplot[color=blue!50, line width=1.5,] table[x={x}, y={f}]{data.csv}
我希望通过类似函数表示其导数\addplot
,而无需从中生成辅助数据data.csv
。更具体地说,我想要一个自动化 TikZ 程序,给定数据返回导数的分段常数图。对于前面的数据示例,图:
如果 0<x<0.25,则 f(x) = (2-3)/(0.25-0);如果 0.25<x<0.5,则 f(x) = (2-2)/(0.5-0.25);如果 0.5<x<0.75,则 f(x) = (0-2)/(0.75-0.5);如果 0.75<x<1,则 f(x) = (1-0)/(1-0.75)。
谢谢!
答案1
像这样吗?
\documentclass[border=5mm]{standalone}
\usepackage{pgfplotstable}
\pgfplotstableread{
x f
0 3
0.25 2
0.5 2
0.75 0
1 1
}\mydata
\pgfplotstablecreatecol[
create col/assign/.code={
\ifnum\pgfplotstablerow=0
\pgfmathsetmacro\tmpish{(\nextrow{f}-\thisrow{f})/(\nextrow{x}-\thisrow{x})}
\else
\pgfmathsetmacro\tmpish{(\thisrow{f}-\prevrow{f})/(\thisrow{x}-\prevrow{x})}
\fi
\edef\entry{\tmpish}%
\pgfkeyslet{/pgfplots/table/create col/next content}\entry
}
]{dfdx}{\mydata}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xtick distance=0.25, ytick distance=1, grid]
\addplot table {\mydata};
% use jump mark right instead of const plot mark right if you
% don't want the vertical lines
\addplot +[const plot mark right, mark=none, ultra thick] table[x=x,y=dfdx] {\mydata};
\end{axis}
\end{tikzpicture}
\end{document}