4

I'd like to draw something like the following (which was done in Mathematica) in pgfplots, but I can't find a way to define a piecewise linear function and have pgfplots get the full and empty circles correct. I could probably get something close by doing a constant plot with right marks, but it feels like there's probably a better way to do it directly. Any ideas appreciated.

Piecewise linear plot

4

Two ways: first, definig a function and plotting each piece separately, as was suggested in What is the clearest way to graph a piecewise function?; second , using two plots (the first approach might seem an overkill here):

\documentclass{article}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}[
  declare function={
    func(\x) = (\x<0.5) * (1)  +  and(\x>0.5, \x<1) * (0);
  }
]
\begin{axis}[
  axis lines=middle,
  enlargelimits
]
\foreach \start/\end  in {0/0.5, 0.5/1} 
  \addplot[domain=\start:\end,blue,thick,samples=10] {func(x)};
\draw[blue,fill=blue] 
  (axis cs:0.5,1) circle (2pt);
\draw[blue,fill=white] 
  (axis cs:0.5,0) circle (2pt);
\end{axis}
\end{tikzpicture} 

\begin{tikzpicture}
\begin{axis}[
  axis lines=middle,
  enlargelimits
]
\foreach \start/\end/\Func  in {0/0.5/1, 0.5/1/0} 
  \addplot[domain=\start:\end,blue,thick,samples=10] {\Func};
\draw[blue,fill=blue] 
  (axis cs:0.5,1) circle (2pt);
\draw[blue,fill=white] 
  (axis cs:0.5,0) circle (2pt);
\end{axis}
\end{tikzpicture} 

\end{document}

enter image description here

The filled and "empty" dots can be produced using small circles placed at the desired location using the axis cs coordinate system. If you want to see the axis beneath the empty dot, add axis on top:

\documentclass{article}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}[
  declare function={
    func(\x) = (\x<0.5) * (1)  +  and(\x>0.5, \x<1) * (0);
  }
]
\begin{axis}[
  axis lines=middle,
  enlargelimits,
  axis on top
]
\foreach \start/\end  in {0/0.5, 0.5/1} 
  \addplot[domain=\start:\end,blue,thick,samples=10] {func(x)};
\draw[blue,fill=blue] 
  (axis cs:0.5,1) circle (2pt);
\draw[blue,fill=white] 
  (axis cs:0.5,0) circle (2pt);
\end{axis}
\end{tikzpicture} 

\begin{tikzpicture}
\begin{axis}[
  axis lines=middle,
  enlargelimits,
  axis on top
]
\foreach \start/\end/\Func  in {0/0.5/1, 0.5/1/0} 
  \addplot[domain=\start:\end,blue,thick,samples=10] {\Func};
\draw[blue,fill=blue] 
  (axis cs:0.5,1) circle (2pt);
\draw[blue,fill=white] 
  (axis cs:0.5,0) circle (2pt);
\end{axis}
\end{tikzpicture} 

\end{document}

enter image description here

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.