我正在尝试使用 Tikz/Pgfplots 绘制一个函数。我对使用 Tikz/Pgfplots 还不熟悉。我使用各种来源创建了代码。以下是 MWE:
\documentclass{standalone}
\usepackage{pgfplots,tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[
font=\scriptsize
]
\begin{axis}[
xmin=0, xmax=525,
ymin=-2.25, ymax=1.75,
xtick={0,25,...,500},
ytick={-2,-1.5,...,1.5},
axis lines=middle,
ymajorgrids,
tick label style={font=\tiny},
xlabel near ticks,
ylabel near ticks,
label style={font=\scriptsize},
y axis line style={stealth-stealth},
xticklabel=\pgfmathprintnumber{\tick}\%,
xticklabel style={rotate=90},
x axis line style={name path=xaxis},
]
\addplot[name path=s,blue,very thick,domain=0:300] {-1.6 + 10/(1+\x/100)^1 - 10/(1+\x/100)^2};
\fill[red,name intersections={of=s and xaxis,name=i},] (i-1) circle (2pt);
\draw[font=\tiny,name intersections={of=s and xaxis},] node[pin={right:\pgfplotspointgetcoordinates{(i-1)} (\pgfmathprintnumber[fixed]{ \pgfkeysvalueof{/data point/x}}\%, \pgfmathprintnumber[fixed]{ \pgfkeysvalueof{/data point/y}})}] at (i-1){};
\end{axis}
\end{tikzpicture}
\end{document}
交点的坐标是正确的 (25%,0)。但是,当我将域更改为 时domain=0:500
,交点的坐标变为 (26.39%,0),这是错误的。以下是域更改后的图:
你知道为什么会发生这种情况吗?提前谢谢您。
答案1
xaxis
在您的示例中,似乎s
在任何采样点都没有相同的值,因此交点实际上发生在采样点之间的某个地方。
\pgfmathprintnumber[fixed]{...}
要看到这一点,只需从打印交叉点坐标中删除选项。
当然,如果你按照@mickep 在其评论中的建议增加样本数量(从默认值开始),不同域大小的坐标之间的差异就会变小。例如,在 ˙samples=101` 时,差异几乎可以忽略不计:
和
MWE 对此进行了稍微修改/缩短的代码演示,如下所示:
\documentclass[margin=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[
C/.style = {circle, draw=none, fill=red, inner sep=2pt, node contents={},
pin=above right:{\pgfplotspointgetcoordinates{(#1)} %
(\pgfkeysvalueof{/data point/x}\%,
\pgfkeysvalueof{/data point/y})
}
}
]
\begin{axis}[
axis lines=middle,
y axis line style={stealth-stealth},
x axis line style={name path=xaxis},
ymajorgrids,
%
xmin=0, xmax=525,
ymin=-1.75, ymax=1.75,
xtick={0,25,...,500},
ytick={-1.5,...,1.5},
ticklabel style={font=\tiny},
xticklabel=\pgfmathprintnumber{\tick}\%,
xticklabel style={rotate=90},
%
no marks,
domain=0:300,
% domain=0:500,
samples=101 % <---
]
\addplot +[name path=s,
very thick] {-1.6 + 10/(1+\x/100)^1 - 10/(1+\x/100)^2};
\fill[red,name intersections={of=s and xaxis,name=i}] (i-1) node[C={i-1}];
\end{axis}
\end{tikzpicture}
\end{document}