Hướng dẫn python contour irregular grid - lưới không đều đường viền python

Tôi có một tập dữ liệu với ba cột, vị trí x và y, sau đó chiều cao/màu z.

Theo lời khuyên được đưa ra ở đây làm cho đường viền phân tán, tôi đang cố gắng thực hiện một số lô đường viền. Tôi đã sử dụng mã này nhiều lần trong quá khứ, nhưng dường như nó không hoạt động cho bộ dữ liệu cụ thể này. Khi tôi vẽ dữ liệu như một biểu đồ phân tán màu, tôi nhận được điều này:

Hướng dẫn python contour irregular grid - lưới không đều đường viền python

Trông có vẻ chính xác, nhưng khi tôi cố gắng biến dữ liệu đó thành một biểu đồ đường viền, đầu ra là thế này:

Hướng dẫn python contour irregular grid - lưới không đều đường viền python

Nhưng toàn bộ cốt truyện nên được điền vào, đặc biệt là vì tôi đang sử dụng phép nội suy tuyến tính với GridData để điền vào các điểm bị thiếu. Tôi đang làm gì sai? Mã này hoạt động cho các bộ dữ liệu khác ...

Đây là mã của tôi:

def grid(x, y, z, resX=100, resY=100):

    x = np.where(type(x) != np.float64, x, np.nan)
    y = np.where(type(y) != np.float64, y, np.nan)
    z = np.where(type(z) != np.float64, z, np.nan)

    contour_data = pd.DataFrame()

    contour_data['x'] = x
    contour_data['y'] = y
    contour_data['z'] = z

    contour_data = contour_data[contour_data['x'].notna()]
    contour_data = contour_data[contour_data['y'].notna()]
    contour_data = contour_data[contour_data['z'].notna()]

    x = contour_data['x']
    y = contour_data['y']
    z = contour_data['z']

    #prepare to create grid
    xi = np.linspace(min(x), max(x), resX)
    yi = np.linspace(min(y), max(y), resY)

    #grid x, y, z
    X, Y = np.meshgrid(xi, yi)
    Z = griddata((x, y), z, (X, Y), method='linear')
    return X, Y, Z

X,Y,Z = grid(data['TIME'],data['ALT'],data['MER'])

plt.contourf(X,Y,Z, 50,cmap='jet')

plt.show()

Ghi chú

Nhấn vào đây để tải xuống mã ví dụ đầy đủhere to download the full example code

So sánh một biểu đồ đường viền của dữ liệu cách đều nhau không đều được nội suy trên lưới thông thường so với biểu đồ Tricontour cho một lưới hình tam giác không cấu trúc.

Kể từ khi contourcontourf mong đợi dữ liệu sẽ sống trên lưới thông thường, việc vẽ một biểu đồ đường viền của dữ liệu cách đều nhau không thường xuyên đòi hỏi các phương pháp khác nhau. Hai tùy chọn là:

  • Nội suy dữ liệu vào một lưới thông thường trước. Điều này có thể được thực hiện với các phương tiện trên bo mạch, ví dụ: thông qua LinearTriInterpolator hoặc sử dụng chức năng bên ngoài, ví dụ: thông qua scipy.interpolate.griddata. Sau đó vẽ sơ đồ dữ liệu được nội suy với contour thông thường.

  • Trực tiếp sử dụng tricontour hoặc tricontourf sẽ thực hiện một tam giác trong nội bộ.

Ví dụ này cho thấy cả hai phương thức trong hành động.

import matplotlib.pyplot as plt
import matplotlib.tri as tri
import numpy as np

np.random.seed(19680801)
npts = 200
ngridx = 100
ngridy = 200
x = np.random.uniform(-2, 2, npts)
y = np.random.uniform(-2, 2, npts)
z = x * np.exp(-x**2 - y**2)

fig, (ax1, ax2) = plt.subplots(nrows=2)

# -----------------------
# Interpolation on a grid
# -----------------------
# A contour plot of irregularly spaced data coordinates
# via interpolation on a grid.

# Create grid values first.
xi = np.linspace(-2.1, 2.1, ngridx)
yi = np.linspace(-2.1, 2.1, ngridy)

# Linearly interpolate the data (x, y) on a grid defined by (xi, yi).
triang = tri.Triangulation(x, y)
interpolator = tri.LinearTriInterpolator(triang, z)
Xi, Yi = np.meshgrid(xi, yi)
zi = interpolator(Xi, Yi)

# Note that scipy.interpolate provides means to interpolate data on a grid
# as well. The following would be an alternative to the four lines above:
# from scipy.interpolate import griddata
# zi = griddata((x, y), z, (xi[None, :], yi[:, None]), method='linear')

ax1.contour(xi, yi, zi, levels=14, linewidths=0.5, colors='k')
cntr1 = ax1.contourf(xi, yi, zi, levels=14, cmap="RdBu_r")

fig.colorbar(cntr1, ax=ax1)
ax1.plot(x, y, 'ko', ms=3)
ax1.set(xlim=(-2, 2), ylim=(-2, 2))
ax1.set_title('grid and contour (%d points, %d grid points)' %
              (npts, ngridx * ngridy))

# ----------
# Tricontour
# ----------
# Directly supply the unordered, irregularly spaced coordinates
# to tricontour.

ax2.tricontour(x, y, z, levels=14, linewidths=0.5, colors='k')
cntr2 = ax2.tricontourf(x, y, z, levels=14, cmap="RdBu_r")

fig.colorbar(cntr2, ax=ax2)
ax2.plot(x, y, 'ko', ms=3)
ax2.set(xlim=(-2, 2), ylim=(-2, 2))
ax2.set_title('tricontour (%d points)' % npts)

plt.subplots_adjust(hspace=0.5)
plt.show()

Hướng dẫn python contour irregular grid - lưới không đều đường viền python

Phòng trưng bày được tạo ra bởi Sphinx-Gallery