1

In the code here:Tikz-PGF: Draw integral test plot, they have their a sub n's centered in their rectangles. I have taken their code and edited it a bit, but my a_n's are not centered anymore. Why is this happening and how do I fix it?

\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
    Can you make a complete example? right segments is not a standard key, and you have several custom colours. – Torbjørn T. Oct 7 '17 at 17:58
3

The coordinate system inside an axis is different from the general coordinate system of the tikzpicture, so you need to place your nodes inside the axis.

That said, there are two caveats:

  • Because of how the axis is parsed, you can't use a \foreach loop quite like normal. Read section 8.1 Utility commands in the pgfplots manual. In the code below there are two different options.
  • Unless you have \pgfplotsset{compat=1.11} (or a higher version), coordinates are still not in axis units, unless you use (axis cs:x,y) instead of (x,y).

output of code

\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}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.