python - chart - set title matplotlib
Diagrama de contorno polar en matplotlib: ¿la mejor forma(moderna) de hacerlo? (2)
La forma de x, y y los valores deben ser los mismos. Su forma de datos es:
>>> x.shape, y.shape, values.shape
((36, 7), (36, 7), (7, 36))
así que cambie el contorno (x, y, valores) al contorno (x, y, valores.T).
Actualización: he hecho una reseña completa de la forma en que encontré hacer esto en mi blog en http://blog.rtwilson.com/producing-polar-contour-plots-with-matplotlib/ : puede que desee cheque allí primero
Estoy tratando de trazar un diagrama de contorno polar en matplotlib. He encontrado varios recursos en Internet, (a) Parece que no consigo que mi código funcione y (b) muchos de los recursos parecen bastante antiguos, y me pregunto si hay una mejor manera ahora. Por ejemplo, http://www.mail-archive.com/[email protected]/msg01953.html sugiere que se puede hacer algo para mejorar las cosas pronto, ¡y eso fue en 2006!
Me encantaría poder trazar diagramas de contorno polar correctos, como pcolor le permite hacerlo por su tipo de trama (vea la sección comentada a continuación), pero parece que no puedo encontrar ninguna manera de hacerlo, así que Convertir primero a coordenadas cartesianas.
De todos modos, tengo el siguiente código:
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)
Cuando lo ejecuto recibo un error TypeError: Inputs x and y must be 1D or 2D.
. No estoy seguro de por qué lo consigo, ya que tanto x como y son 2D. ¿Estoy haciendo algo mal?
Además, parece bastante torpe estar poniendo mis valores devueltos de mi modelo en una lista y luego reconfigurándolos. ¿Hay una mejor manera de hacer esto?
Solo deberías poder usar ax.contour
o ax.contourf
con trazados polares como lo harías normalmente ... Sin embargo, tienes algunos errores en tu código. Convierte las cosas en radianes, pero luego usa los valores en grados cuando grafica. Además, estás pasando en r, theta
a contorno cuando espera theta, r
.
Como un ejemplo rápido:
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()