Contour plot in Python importing txt table file

前端 未结 2 1693
情话喂你
情话喂你 2021-01-07 03:21

I am trying to make a contour plot like:

\"contour\"

Using a table of data like 3 columns in a txt file

相关标签:
2条回答
  • The code below worked for me:

    import scipy.interpolate    
    import numpy as np  
    
    N = 500 #number of points for plotting/interpolation    
    x, y, z = np.genfromtxt(r'data.dat', unpack=True)
    xll = x.min();  xul = x.max();  yll = y.min();  yul = y.max()
    
    xi = np.linspace(xll, xul, N)
    yi = np.linspace(yll, yul, N)
    zi = scipy.interpolate.griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
    
    contours = plt.contour(xi, yi, zi, 6, colors='black')
    plt.clabel(contours, inline=True, fontsize=7)
    plt.imshow(zi, extent=[xll, xul, yll, yul], origin='lower', cmap=plt.cm.jet, alpha=0.9)
    plt.xlabel(r'$x$')
    plt.ylabel(r'$y$')
    plt.clim(0, 1)
    plt.colorbar()
    plt.show()
    
    0 讨论(0)
  • 2021-01-07 04:12

    Followup from my comment... first, I would replace all these lines:

    data = np.loadtxt(r'dataa.txt')
    
    a = [data[:,0]]
    b = [data[:,1]]
    n = [data[:,2]]
    
    x = np.asarray(a)
    y = np.asarray(b)
    z = np.asarray(n)
    

    With:

    x, y, z = np.genfromtxt(r'dataa.txt', unpack=True)
    

    Your original code is adding an extra axis at the front, since [data[:,0]] is a list of arrays with one element. The result is that x.shape will be (1, N) instead if (N,). All of this can be done automatically using the last line above, or you could just use the same data loading and say:

    x = data[:,0]
    y = data[:,1]
    z = data[:,2]
    

    since those slices will give you an array back.

    However, you're not quite done, because plt.contour expects you to give it a 2d array for z, not a 1d array of values. Right now, you seem to have z values at given x, y points, but contour expects you to give it a 2d array, like an image.

    Before I can answer that, I need to know how x and y are spaced. If regularly, you can just populate an array pretty easily. If not regularly, you basically have to interpolate before you can make a contour plot.

    To do the interpolation, use

    import numpy as np
    import matplotlib.pyplot as plt
    import scipy.interpolate
    
    N = 1000 #number of points for plotting/interpolation
    
    x, y, z = np.genfromtxt(r'dataa.txt', unpack=True)
    
    xi = np.linspace(x.min(), x.max(), N)
    yi = np.linspace(y.min(), y.max(), N)
    zi = scipy.interpolate.griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
    
    fig = plt.figure()
    plt.contour(xi, yi, zi)
    plt.xlabel("X")
    plt.ylabel("Y")
    plt.show()
    
    0 讨论(0)
提交回复
热议问题