I ended up cooking up my own solution after I realized that you could extract raw arrays as
uvals = u.vector().array()
xyvals = coordinates()
xvals = xyvals[:,0]
yvals=xyvals[:,1]
This gives you (x,y,z) triples, which could be plotted as a scatter plot. But if you can instead do
xx = np.linspace(0,1)
yy = np.linspace(0,1)
XX, YY = np.meshgrid(xx,yy)
uu = griddata(xvals, yvals, uvals, xx, yy,interp='linear')
which then gives you the write kind of data to use in countour, contourf, or the mlab surface plots