matplotlib pcolormesh plot from x,y,z data

后端 未结 4 541
深忆病人
深忆病人 2021-01-06 03:03

I have data in a textfile in tableform with three columns. I use np.genfromtxt to read all the columns into matplotlib as x, y, z.

I want to create a color meshplot

相关标签:
4条回答
  • 2021-01-06 03:50

    It seems you are plotting X and Y as 2D arrays while Z is still a 1D array. Try something like:

    Znew=np.reshape(z,(len(xmesh[:,0]),len(xmesh[0,:])))
    diagram1.pcolormesh(xmesh,ymesh,Znew) 
    

    Update: Tou have a X/Y grid of size 4x4:

    x = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (0))
    y = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (1))
    z = np.genfromtxt('mesh.txt', dtype=float, delimiter=' ', usecols = (2))
    

    Reshape the arrays as suggestet by @Gustav Larsson and myself like this:

    Xnew=np.reshape(x,(4,4)) 
    Xnew=np.reshape(y,(4,4))
    Znew=np.reshape(z,(4,4))
    

    Which gives you three 4x4 arrays to plot using pcolormesh:

    diagram1.pcolormesh(Xnew,Ynew,Znew) 
    
    0 讨论(0)
  • 2021-01-06 04:00

    In the example data provided above, x, y, and z can be easily reshaped to get 2D array. The answer below is for someone who is looking for more generalized answer with random x,y, and z arrays.

    import matplotlib.pyplot as plt
    from matplotlib.mlab import griddata
    import numpy
    
    # use your x,y and z arrays here
    x = numpy.random.randint(1,30, 50)
    y = numpy.random.randint(1,30, 50)
    z = numpy.random.randint(1,30, 50)
    
    yy, xx = numpy.meshgrid(y,x)
    zz = griddata(x,y,z,xx,yy, interp='linear')
    plt.pcolor(zz)
    #plt.contourf(xx,yy,zz) # if you want contour plot
    #plt.imshow(zz)
    plt.pcolorbar()
    plt.show()
    

    0 讨论(0)
  • 2021-01-06 04:03

    I had the same problem and agree with Gustav Larsson's suggestion to use

    scatter(x, y, c=z)
    

    In my particular case, I set the linewidths of the scatter points to zero:

    scatter(x, y, c=z, linewidths=0)
    

    of course, you can play around with other decorations, color schemes etc., the reference of matplotlib.pyplot.scatter will help you further.

    0 讨论(0)
  • 2021-01-06 04:05

    My guess is that x, y and z will be read as one-dimensional vectors of the same length, let's say N. The problem is that when you create your xmesh and ymesh, they are N x N, which your z values should be as well. It's only N, which is why you are getting an error.

    What is the layout of your file? I'm guessing each row is a (x,y,z) that you want to create a mesh from. In order to do this, you need to know how the points are ordered as a mesh (either as row-major or column-major). Once you know this, instead of creating xmesh and ymesh, you can do something like this:

    N = np.sqrt(len(x)) # Only if squared, adjust accordingly
    x = x.reshape((N, N))
    y = y.reshape((N, N))
    z = z.reshape((N, N))
    pcolormesh(x, y, z)
    

    Before doing this, I would start by doing this:

    scatter(x, y, c=z)
    

    which will give you the points of the mesh, which is a good starting point.

    0 讨论(0)
提交回复
热议问题