在这里的代码中:Tikz-PGF:绘制积分测试图,它们的 a 子 n 位于矩形的中心。我获取了它们的代码并对其进行了少许编辑,但我的 a_n 不再位于中心。为什么会发生这种情况?我该如何修复?
\begin{center}
\begin{tikzpicture}[/pgf/declare function={f=1/x;}]
\pgfplotsset{width=12cm, height = 6cm}
\begin{axis}[
xmin=0,xmax=9,ymin=0,ymax=1,
domain=0:10,
samples=100,
axis lines=center,
grid=major,
no marks,
]
\addplot [
black!50,
fill=blackwhite,
right segments=8,
right=1:9,
] {f};
\addplot [thick, bluedark] {f};
\end{axis}
\foreach \x/\t in {1.5/$a_1$,2.5/$a_2$,3.5/$a_3$,7.5/$a_7$}
\node[black] at (\x,{4/(\x+1)-0.25}){\t};
\end{tikzpicture}
\end{center}
答案1
内部的坐标系axis
与一般的坐标系不同tikzpicture
,因此您需要将节点放置在里面这axis
。
话虽如此,但仍有两点需要注意:
- 由于
axis
解析的方式,您不能\foreach
像平常一样使用循环。阅读第 8.1 节实用程序命令在pgfplots
手册中。在下面的代码中有两个不同的选项。 - 除非您有
\pgfplotsset{compat=1.11}
(或更高版本),否则坐标仍然不是以轴单位表示,除非您使用(axis cs:x,y)
而不是(x,y)
。
\documentclass{article}
\usepackage{pgfplots}
% right hand sums
\pgfplotsset{
right segments/.code={\pgfmathsetmacro\rightsegments{#1}},
right segments=3,
right/.style args={#1:#2}{
ybar interval,
domain=#1+((#2-#1)/\rightsegments):#2+((#2-#1)/\rightsegments),
samples=\rightsegments+1,
x filter/.code=\pgfmathparse{\pgfmathresult-((#2-#1)/\rightsegments)}
}
}
\begin{document}
\begin{center}
\begin{tikzpicture}[
declare function={f(\x)=1/(\x);} % <-- modified
]
\begin{axis}[
xmin=0,xmax=9,ymin=0,ymax=1,
domain=0:10,
samples=100,
axis lines=center,
grid=major,
no marks,
width=12cm,
height = 6cm
]
\addplot [
black!50,
fill=black!40!white,
right segments=8,
right=1:9,
] {f(x)}; % <-- modified
\addplot [thick, blue!80!black] {f(x)}; % <-- modified
% option 1
%\foreach \x/\t in {1.5/$a_1$,2.5/$a_2$,3.5/$a_3$,7.5/$a_7$}
% {
% \edef\temp{\noexpand\node[black] at (axis cs:\x,{f(\x+0.5)/2}) {\t};}
% \temp
%}
% option 2
\pgfplotsinvokeforeach{2,3,4,8}{%
\node at (axis cs:#1+0.5,{f(#1+1)/2}) {$a_{#1}$};
}
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}