[Tex/LaTex] Plotting an implicit function using pgfplots

gnuplotpgfplotsplot

What is the correct way to plot an implicit function using pgfplots? Consider the following example:

\documentclass{standalone}
\usepackage{pgfplots}

\pgfplotsset{compat=newest}

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \addplot+[mark=none] function[raw gnuplot] {
      set contour base;
      set cntrparam levels discrete 0.0;
      unset surface;
      set view map;
      set isosamples 500;
      splot exp(x)*cos(y)-1-x;
    };
  \end{axis}
\end{tikzpicture}

\end{document}

This is what the function looks like in gnuplot:

expected result

pgfplots, however, connects function's segments, which is unexpected:

incorrect pgfplots result

Best Answer

The development version of PGFPlots includes an empty line option that can be used to influence the behaviour. It is set to jump by default, which breaks the plot when an empty line is encountered. If you're using TeXLive, you can update PGFPlots through tlmgr by temporarily using the repository http://tlcontrib.metatex.org/2010.

The gap at the intersections is a numerical artefact introduced by gnuplot. It can't be fixed completely, but by plotting with a thicker line, and choosing a slightly different contour line to be plotted, it can be glossed over:

\documentclass{article}
\usepackage{pgfplots}

\pgfplotsset{compat=newest}

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \addplot +[no markers,
      raw gnuplot,
      thick,
      empty line = jump % not strictly necessary, as this is the default behaviour in the development version of PGFPlots
      ] gnuplot {
      set contour base;
      set cntrparam levels discrete 0.003;
      unset surface;
      set view map;
      set isosamples 500;
      splot exp(x)*cos(y)-1-x;
    };
  \end{axis}
\end{tikzpicture}

\end{document}

pgfplots/gnuplot contour plot