\documentclass[border=10pt]{standalone}
%%%<
\usepackage{verbatim}
%%%>
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.8}
\begin{comment}
:Title: Combining surface and contour plots
:Tags: 2D;3D;Surface plots;Contour plots;GNUplot;Mathematics
:Author: Christian Feuersaenger
:Slug: contour-and-surface

Here we show how contour plots and 3D surface plots can be combined.

Pgfplots can compute the z contours by means of gnuplot and its contour
gnuplot interface.

The projection onto the x axis (i.e. with fixed y) can be done by means of a
matrix line plot in which you replace the y coordinate of the input matrix
by some fixed constant.

The projection onto the y axis (i.e. with fixed x) is more involved (at least
if mesh/ordering=x varies as in my example below) because one needs to
transpose the input matrix. In my example below, I simply replaced the
meaning of x and y to achieve the transposal. This, of course, would be more
involved for a data matrix (and I think that pgfplots has no builtin to do it).

The first contour is the z contour. It is computed using GNUPLOT and that's
why it requires the -shell-escape option. You can find information about this
requirement already on http://pgfplots.net/tikz/examples/contour-surface/ .

The x and y projections are computed using the same matrix of function values.
I chose a different sampling density to control how many "contour lines" shall
be drawn. Note that these lines are conceptionally different from the z
contours: they are already part of the sampling procedure and do not need to
be computed externally. Note that I used mesh, patch type=line to tell pgfplots
that

 - it should use individually colored segments and
 - it should not color the 2d structure, just the lines in scanline order
   (which is mesh/ordering=x varies in my case).

This example was written by Christian Feuersaenger on TeX.SE.
\end{comment}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    domain=-2:2,
    domain y=0:2*pi,
  ]

    \newcommand\expr[2]{exp(-#1^2) * sin(deg(#2))}

    \addplot3[
        contour gnuplot={
            % cdata should not be affected by z filter:
            output point meta=rawz,
            number=10,
            labels=false,
        },
        samples=41,
        z filter/.code=\def\pgfmathresult{-1.6},
    ]
        {\expr{x}{y}};

    \addplot3[
        samples=41,
        samples y=10,
        domain=0:2*pi,
        domain y=-2:2,
        % we want 1d (!) individually colored mesh segments:
        mesh, patch type=line,
        x filter/.code=\def\pgfmathresult{-2.5},
    ] 
        (y,x,{\expr{y}{x}});

    \addplot3[
        samples=41,
        samples y=10,
        % we want 1d (!) individually colored mesh segments:
        mesh, patch type=line,
        y filter/.code=\def\pgfmathresult{8},
    ] 
        {\expr{x}{y}};

    \addplot3[surf,samples=25]
        {\expr{x}{y}};

\end{axis}
\end{tikzpicture}
\end{document}
