/ / Artefakty linii konturu w matplotlibie po interpolacji danych na wykresie biegunowym - python, numpy, matplotlib, scipy

Artefakty linii konturowej w matplotlib po interpolacji danych na wykresie biegunowym - python, numpy, matplotlib, scipy

Mam małe zestawy danych o nieregularnych odstępachzrobione w różnych punktach na okrągłym obszarze, w formacie polarnym. Muszę wykonać interpolację, aby uzyskać dane na regularnej siatce, a następnie chciałbym je wykreślić za pomocą wykresu konturowego.

Udało mi się wykonać interpolację i wykreślićwynik, ale muszę wykonać konwersję ze współrzędnych biegunowych na prostokątne, aby wykonać interpolację, i otrzymuję artefakty na wykresie biegunowym, kiedy konwertuję dane z powrotem na współrzędne biegunowe.

Poniższy kod demonstruje, co mam do tej pory, i wykreśla dane na wykresie biegunowym i prostokątnym:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import Rbf

# inputs as 1D arrays
r = np.array([0, 1, 1, 1, 1, 2, 2, 2, 2])
theta = np.radians(np.array([0, 90, 180, 270, 0, 90, 180, 270, 0]))
# z = f(theta, r)
z = np.array([8, 7, 6, 4, 5, 2, 2, 2, 2])

# convert to rect
x = r * np.cos(theta)
y = r * np.sin(theta)

# create RBF for smoothing
rbf = Rbf(x, y, z)

# create grid to smooth over
xi, yi = np.mgrid[-2:2:10j, -2:2:10j]
# smooth
zi = rbf(xi, yi)

# convert back to polar
ri = np.sqrt(xi*xi + yi*yi)
ti = np.arctan2(yi, xi)

# polar plot
fig = plt.figure()
ax = plt.subplot(121, polar=True)
cax = ax.contour(ti, ri, zi, 10, linewidths=0.5, colors="k")
cax = ax.contourf(ti, ri, zi, 10, cmap=plt.cm.Spectral)
ax.set_rmax(2)

# rect plot
ax = plt.subplot(122)
cax = ax.contour(xi, yi, zi, 10, linewidths=0.5, colors="k")
cax = ax.contourf(xi, yi, zi, 10, cmap=plt.cm.Spectral)

plt.show()

Pozostałe problemy to:

  • Czy mogę naprawić artefakty linii konturu?
  • Czy Scipy zapewnia bardziej odpowiedni algorytm interpolacji, który działa dla takich małych zestawów danych zawierających współrzędne biegunowe?

Odpowiedzi:

3 dla odpowiedzi № 1

Możesz przeczytać to również, ale jeśli chodzi o wykres konturu we współrzędnych biegunowych, matplotlib oczekuje regularnej siatki w promieniu i kącie, więc możesz wszystko ładnie spisać:

# polar plot
ri, ti = np.mgrid[0:2:100j, 0:2*np.pi:100j]
zi = rbf(ri*np.cos(ti), ri*np.sin(ti))

fig = plt.figure()
ax = plt.subplot(121, polar=True)
cax = ax.contour(ti, ri, zi, 10, linewidths=0.5, colors="k")
cax = ax.contourf(ti, ri, zi, 10, cmap=plt.cm.Spectral)
ax.set_rmax(2)

# rect plot
xi, yi = np.mgrid[-2:2:100j, -2:2:100j]
zi = rbf(xi, yi)

ax = plt.subplot(122, aspect="equal")
cax = ax.contour(xi, yi, zi, 10, linewidths=0.5, colors="k")
cax = ax.contourf(xi, yi, zi, 10, cmap=plt.cm.Spectral)
plt.show()

wprowadź opis obrazu tutaj

Jestem trochę zaskoczony twoim użyciem Rbf. Co dokładnie robisz i dlaczego używasz tego interpolatora?