PLplot includes three-dimensional plot routines that plot
    functions of the two independent variables x and
    y in a variety of ways (see the section called “Surface Plots”, the section called “Contour Plots”, the section called “Shade plots”, the section called “Image plots”, and the section called “Vector plots”).
PLplot provides the routines plmesh, plmeshc,
      plot3d, plot3dc, plot3dcl, plsurf3d, plsurf3dl and plfill3
      to plot the projection of a 3D surface on an existing 2D window.  Our
      standard examples 08, 11, 15, 21, and 28 illustrate how
      these routines are used.
In all cases the transformations required to plot the
      projection of a 3D surface on a 2D window are configured by plw3d
      and are done to a rectangular cuboid enclosing the 3D surface which
      has its limits expressed in 3D world coordinates and also normalized
      3D coordinates (used for interpreting the altitude and azimuth of the
      viewing angle).  This representation of the transformation process
      allows considerable flexibility in specifying how the surface is
      depicted.  The lengths of the sides of the normalized rectangular
      cuboid are independent of the 3D world coordinate ranges of each of
      the variables, making it possible to use “reasonable”
      viewing angles even if the ranges of the 3D world coordinates on the
      axes are very different.  The size of the normalized rectangular
      cuboid is determined essentially by the size of the two-dimensional
      window into which it is to be mapped.  The normalized cuboid is
      centered about its origin in the x and
      y directions, but rests on the plane z =
      0.  It is viewed by an observer located at altitude
      alt and azimuth az, where both
      angles are measured in degrees.  The altitude should be restricted to
      the range zero to ninety degrees for proper operation, and represents
      the viewing angle above the xy plane of the normalized cuboid.  The
      azimuth is defined so that when az = 0, the
      observer sees the xz plane face on, and as the angle is increased, the
      observer moves clockwise around the normalized cuboid as viewed from
      above the xy plane.  The azimuth can take on any value.  In the above
      list of examples, we have chosen x and y world-coordinate ranges near
      (-1.0-1.0) for the 2D window, and x, y, z sizes of the normalized
      cuboid near (1., 1., 1.), and users will likely want to adopt similar
      values as well.
PLplot provides the plcont routine for generating
      contour plots and our standard examples 08, 14, 16, and 22 illustrate how
      this routine is used.  The contourer uses a contour-following
      algorithm so that it is possible to use non-continuous line styles.
      Further, one may specify arbitrary coordinate mappings from array
      indices to world coordinates, such as for contours in a polar
      coordinate system.
The path of each contour is initially computed in terms of
      the values of the indices of the matrix that holds the data to be
      contoured.  Before these can be drawn in the current window (see the section called “Defining the Window”), it is necessary to convert from these array
      indices into world coordinates.  This transformation is normally done
      by a callback function which is supplied as an argument to plcont.
      For C use of plcont we have included directly in the PLplot library
      the following transformation callback routines: pltr0 (identity
      transformation); pltr1 (linear interpolation in singly dimensioned
      coordinate arrays); and pltr2 (linear interpolation in doubly
      dimensioned coordinate arrays), but other callbacks can be used for
      the C case instead.  The above list of examples illustrates how this
      callback argument and associated transformation from index arguments to
      world coordinates is implemented in each of our supported
      languages.
PLplot provides the plshade and plshades routines for
      generating shade plots and our standard examples 15, 16, 21, and 22 illustrate how
      those routines are used including how the needed transformation from
      index arguments to world coordinates is implemented in each of
      our supported languages.
PLplot provides the plimage and plimagefr routines for
      generating images plots and our standard example 20 illustrates how
      those routines are used including how the needed transformation from
      index arguments to world coordinates is implemented in each of
      our supported languages.
PLplot provides the plvect routine for
      generating vector plots and our standard example 22 illustrates how
      that routine is used including how the needed transformation from
      index arguments to world coordinates is implemented in each of
      our supported languages.  In addition that routine shows
      how to call plsvect to set the arrow style for vector plots.