I have a question quite similar to this one Matplotlib 3D plot - 2D format for input data? but it only partly solved my problem (which was originally that .plot_surface() didn't recognize any arguments). What I am trying to do is plot a function of 2 parameters and this is what I have:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X,Y = np.meshgrid(positions[0],np.transpose(positions[1]))
Z = data[0]
Axes3D.plot_surface(X, Y, Z)
which throws this error:
TypeError: plot_surface() missing 1 required positional argument: 'Z'
data[0] is a 2D array. (data is a list of 2D arrays). positions is a tuple of a row vector and a column vector, so line 3 is essentially reconstructing positions as two row vectors and then making two matrices one for X and one for Y values as I believe Axes3D.plot_surface() requires.
My problem is that even though Z is 2D array, .plot_surface() refuses to recognize it as such.
Edit: I just confirmed that Z is indeed the correct shape using this:
if Z.shape == X.shape:
print('Same shape')
Axes3D.plot_surface(X, Y, Z)
So I have no idea why it will not work. Even when I use X for Z like this (since it didn't complain about X missing or being the wrong shape) it still gets mad.
Axes3D.plot_surface(X, Y, X)
Edit: In looking around examples and trying things out, I finally got it to work. I hardly consider this solved though, because I still have no idea why one way works and another doesn't, and I don't want to leave this unsolved for posterity. I got it to work by doing this
surf = ax.plot_surface(X, Y, Z)
instead of "Axes3D.plotsurface()". I have no idea why this change got it to work, so please still help me figure this out.