2011-07-01 17 views
8

Mam zestaw danych, które chcę użyć do utworzenia wykresu konturu na współrzędnych biegunowych przy użyciu Matplotlib.Polarny wykres konturu w Matplotlib

Moje dane są następujące:

  • theta - 1D tablicę kątem wartości
  • radius - 1D tablicę promieniu wartości
  • value - 1D tablicę wartości, które chcę wykorzystać do konturów

są to tablice 1D że wyrównanie właściwie - np

theta radius value 
30  1  2.9 
30  2  5.3 
35  5  9.2 

Oznacza to, że wszystkie wartości powtarza się tyle razy, że każdy wiersz tej "tabeli" trzech zmiennych definiuje jeden punkt.

Jak mogę utworzyć polarny wykres konturu na podstawie tych wartości? Zastanawiałem się nad zamianą wartości promienia i teta na wartości x i y, i robię to we współrzędnych kartezjańskich, ale funkcja konturu wydaje się wymagać tablic 2D i nie mogę do końca zrozumieć dlaczego.

Wszelkie pomysły?

Odpowiedz

8

Funkcja Matplotlib o nazwie contour() oczekuje, że dane będą uporządkowane jako siatka 2D punktów i odpowiadająca im siatka wartości dla każdego z tych punktów siatki. Jeśli twoje dane są naturalnie ułożone w siatkę, możesz przekonwertować r, theta na x, y i użyć contour(r*np.cos(theta), r*np.sin(theta), values), aby utworzyć fabułę.

Jeśli twoje dane nie są naturalnie siatkowe, powinieneś postępować zgodnie z poradami Stephena i użyć griddata() do interpolacji danych na siatkę.

Poniższy skrypt pokazuje przykłady obu.

import pylab as plt 
from matplotlib.mlab import griddata 
import numpy as np 

# data on a grid 
r = np.linspace(0, 1, 100) 
t = np.linspace(0, 2*np.pi, 100) 
r, t = np.meshgrid(r, t) 
z = (t-np.pi)**2 + 10*(r-0.5)**2 

plt.subplot(121) 
plt.contour(r*np.cos(t), r*np.sin(t), z) 

# ungrid data, then re-grid it 
r = r.flatten() 
t = t.flatten() 
x = r*np.cos(t) 
y = r*np.sin(t) 
z = z.flatten() 
xgrid = np.linspace(x.min(), x.max(), 100) 
ygrid = np.linspace(y.min(), y.max(), 100) 
xgrid, ygrid = np.meshgrid(xgrid, ygrid) 
zgrid = griddata(x,y,z, xgrid, ygrid) 

plt.subplot(122) 
plt.contour(xgrid, ygrid, zgrid) 

plt.show() 

enter image description here

+0

Dzięki za bardzo jasnej odpowiedzi. Wysłałem kolejne pytanie dotyczące osi - http://stackoverflow.com/questions/6556361/add-polar-axes-to-cartesian-plot-in-matplotlib. Zastanawiam się, czy mógłbyś w tym pomóc? – robintw

3

Nie wiem, czy możliwe jest wykonanie bezpośredniego wykresu biegunowego, ale jeśli dokonasz konwersji na współrzędne kartezjańskie, możesz użyć funkcji griddata do konwersji twoich tablic 1D na 2D.

Powiązane problemy