Полярный контурный сюжет в matplotlib - лучший (современный) способ сделать это?

Обновление: я сделал полное описание того, как я нашел это в своем блоге по адресу http://blog.rtwilson.com/producing-polar-contour-plots-with-matplotlib/ - вы можете захотеть проверьте там сначала.

Я пытаюсь построить полярный контур в matplotlib. Я нашел различные ресурсы в Интернете, (а) я не могу заставить свой код работать, и (б) многие ресурсы выглядят довольно старыми, и мне интересно, есть ли лучший способ сейчас. Например, http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg01953.html предполагает, что что-то может быть сделано для улучшения ситуации в ближайшее время, и это было в 2006 году!

Я хотел бы иметь возможность строить правильные полярные контурные графики - как pcolor позволяет вам делать для своего типа графика (см. Закомментированный раздел ниже), но я не могу найти какой-либо способ сделать это, поэтому я сначала преобразование в декартовы координаты.

Во всяком случае, у меня есть следующий код:

from pylab import *
import numpy as np

azimuths = np.arange(0, 360, 10)
zeniths = np.arange(0, 70, 10)
values = []

for azimuth in azimuths:
  for zenith in zeniths:
    print "%i %i" % (azimuth, zenith)
    # Run some sort of model and get some output
    # We'll just use rand for this example
    values.append(rand())

theta = np.radians(azimuths)

values = np.array(values)
values = values.reshape(len(zeniths), len(azimuths))

# This (from http://old.nabble.com/2D-polar-surface-plot-td28896848.html)
# works fine
##############
# Create a polar axes
# ax = subplot(111, projection='polar')
# pcolor plot onto it
# c = ax.pcolor(theta, zeniths, values)
# show()

r, t = np.meshgrid(zeniths, azimuths)

x = r*np.cos(t)
y = r*np.sin(t)

contour(x, y, values)

Когда я запускаю это, я получаю ошибку TypeError: Inputs x and y must be 1D or 2D., Я не уверен, почему я получаю это, так как x и y являются 2D. Я делаю что-то неправильно?

Кроме того, довольно неудобно помещать мои значения, возвращенные из моей модели, в список, а затем изменять его. Есть лучший способ сделать это?

2 ответа

Решение

Вы должны просто быть в состоянии использовать ax.contour или же ax.contourf с полярными графиками, как обычно... У вас есть несколько ошибок в коде. Вы конвертируете вещи в радианы, но затем используете значения в градусах при построении графика. Кроме того, вы проходите в r, theta контур, когда он ожидает theta, r,

В качестве быстрого примера:

import numpy as np
import matplotlib.pyplot as plt

#-- Generate Data -----------------------------------------
# Using linspace so that the endpoint of 360 is included...
azimuths = np.radians(np.linspace(0, 360, 20))
zeniths = np.arange(0, 70, 10)

r, theta = np.meshgrid(zeniths, azimuths)
values = np.random.random((azimuths.size, zeniths.size))

#-- Plot... ------------------------------------------------
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
ax.contourf(theta, r, values)

plt.show()

Форма x, y и значения должны быть одинаковыми. Ваша форма данных:

>>> x.shape, y.shape, values.shape
((36, 7), (36, 7), (7, 36))

поэтому измените контур (x, y, значения) на контур (x, y, значения.T).

Другие вопросы по тегам