Полярный контурный участок в Матплотлибе - PullRequest
8 голосов
/ 01 июля 2011

У меня есть набор данных, которые я хочу использовать для создания контурного графика в полярных координатах с использованием Matplotlib.

Мои данные следующие:

  • theta - 1D массив значений углов
  • radius - одномерный массив значений радиуса
  • value - 1D массив значений, которые я хочу использовать для контуров

Это все одномерные массивы, которые правильно выровнены - например:

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

То есть все значения повторяются достаточно много раз, так что каждая строка этой «таблицы» из трех переменных определяет одну точку.

Как я могу создать полярный контур из этих значений? Я думал о том, чтобы преобразовать значения радиуса и тета в значения x и y и сделать это в декартовых координатах, но для функции контура, похоже, требуются двумерные массивы, и я не совсем понимаю, почему.

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 01 июля 2011

Функция contour() Matplotlib предполагает, что данные будут упорядочены как двумерная сетка точек и соответствующая сетка значений для каждой из этих точек сетки.Если ваши данные естественным образом упорядочены в сетке, вы можете преобразовать r, theta в x, y и использовать contour(r*np.cos(theta), r*np.sin(theta), values) для построения графика.

Если ваши данные не имеют естественной сетки, вы должны следовать совету Стивена ииспользовал griddata() для интерполяции ваших данных в сетку.

Следующий скрипт показывает примеры обоих.

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

3 голосов
/ 01 июля 2011

Я не знаю, можно ли напрямую построить полярный контур, но если вы преобразуете в декартовы координаты, вы можете использовать функцию griddata для преобразования ваших 1D массивов в 2D.

...