4

So I have a 2D array (named Data) that looks like:

            Shape 0       Shape 1     ...      Shape N
            -------       -------              -------

Scale 0  |  Value00   ,   Value01     ...      Value0N |

Scale 1  |  Value10   ,   Value11     ...      Value1N |

  .
  .
  .

Scale N  |  ValueN0   ,   ValueN1     ...      ValueNN |

And I want to create a 3D plot where the ValueXXs are the Z axis. I've tried two attempts, but each give me a surface that is rotated with respect to the other one, so I've gotten myself a bit confused. Here is my 1st attempt at a solution:

x,y = numpy.mgrid[0:50:50j,0:50:50j]
f = Data
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(x,y,f,rstride=1,cstride=1)

Here is my second attempt:

nx, ny = 50, 50
x = range(nx)
y = range(ny)
hf = plt.figure()
ha = hf.add_subplot(111, projection='3d')
X, Y = numpy.meshgrid(x, y)  
ha.plot_surface(X,Y,Data,rstride=1,cstride=1)

Examining X and Y does no help really because its a square. I'm not sure when X represents my 'Scale' vs when it is representing my 'Shape'.

So, what is really going on with these two examples? Is there a better way to plot this array?

Thanks!

1
  • I find when I have such a case, it's usually easiest to deliberately generate a test dataset with different x and y axis sizes. This will enable you to inspect the plot, and in some cases (e.g. pcolor) it will throw an error if you get the x and y axis arrays wrong. Commented Nov 5, 2012 at 8:02

1 Answer 1

1

If I understand you right, the confusion is which axis is which, right? If this is the case, you can easily plot a known asymmetric shape and the plot will tell you everything. For example, adopting an example from the gallery:

# By Armin Moser

from mpl_toolkits.mplot3d import Axes3D
import matplotlib
import numpy as np
from matplotlib import cm
from matplotlib import pyplot as plt
step = 0.04
maxval = 1.0
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# create supporting points in polar coordinates
r = np.linspace(0,1.25,50)
p = np.linspace(0,2*np.pi,50)
R,P = np.meshgrid(r,p)
# transform them to cartesian system
X,Y = R*np.cos(P),R*np.sin(P)

#Z = ((R**2 - 1)**2)
Z = (X**2 + 0.2*Y**2 -1)**2   # <------- edit

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet)
#ax.set_zlim3d(0, 1)
ax.set_xlabel(r'$\phi_\mathrm{real}$')
ax.set_ylabel(r'$\phi_\mathrm{im}$')
ax.set_zlabel(r'$V(\phi)$')
plt.show()
Sign up to request clarification or add additional context in comments.

1 Comment

Well, basically I want to know the difference in behaviour of those two methods. I stared at the plot for a while and found one grid line that had a distinctive shape. By plotting it, I was able to distinguish what method 1 does. Basically, my method 1 literally plotted my array as I wanted it. The rows correspond to the X axis, and the columns correspond to the Y axis. If anyone could give a more detailed answer to both methods behaviour it would be a great help to me and others. Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.