Полярный контурный график в matplotlib - лучший (современный) способ сделать это?
Обновление: Я сделал полную запись того, как я нашел это в своем блоге, http://blog.rtwilson.com/producing-polar-contour-plots-with-matplotlib/ - вы можете сначала проверить его.
Я пытаюсь построить график полярного контура в matplotlib. Я нашел различные ресурсы в Интернете, (а) я не могу заставить код работать, и (б) многие из ресурсов выглядят довольно старыми, и мне интересно, есть ли теперь лучший способ. Например, http://www.mail-archive.com/[email protected]/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. Я что-то делаю неправильно?
Кроме того, кажется довольно неуклюжим, чтобы вернуть мои значения из моей модели в список и затем изменить его. Есть ли лучший способ сделать это?
Ответы
Ответ 1
Вы должны просто использовать 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()
![enter image description here]()
Ответ 2
форма x, y и значения должны быть одинаковыми. Форма данных:
>>> x.shape, y.shape, values.shape
((36, 7), (36, 7), (7, 36))
измените контур (x, y, values) на контур (x, y, values.T).