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!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.