Plotting a 2D Array with Matplotlib

17,057

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()
Share:
17,057

Related videos on Youtube

The Dude
Author by

The Dude

Current high school student from rural New York. I love engineering, mathematics, digital signal processing and the German language.

Updated on September 14, 2022

Comments

  • The Dude
    The Dude about 1 year

    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!

  • The Dude
    The Dude about 11 years
    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!