Polar gráfico de contorno en matplotlib – mejor (moderno) manera de hacerlo?

Actualización: he hecho una redacción completa de la manera que he encontrado para hacer esto en mi blog en http://blog.rtwilson.com/producing-polar-contour-plots-with-matplotlib/ – es posible que desee comprobar primero.

Estoy tratando de trazar un polar gráfico de contorno en matplotlib. He encontrado varios recursos en internet, (a) me parece que no puede conseguir mi código de trabajo y (b) muchos de los recursos que se parecen bastante viejo, y me pregunto si hay una manera mejor ahora. Por ejemplo, http://www.mail-archive.com/[email protected]/msg01953.html sugiere que algo se puede hacer para mejorar las cosas pronto, y que fue en el 2006!

Me encantaría ser capaz de trazar adecuada polar contorno de las parcelas – como pcolor le permite hacer de su tipo de trama (véase el comentario de la sección de abajo), pero me parece que no puede encontrar una manera de hacer eso, así que me estoy convirtiendo a cartesianas coordenadas primera.

De todos modos, tengo el código que sigue:

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)

Al ejecutar me sale un error TypeError: Inputs x and y must be 1D or 2D.. No estoy seguro de por qué me sale esto, como x e y son en 2D. Estoy haciendo algo mal?

También, me parece bastante torpe para ir poniendo mis valores devueltos de mi modelo en una lista y, a continuación, la remodelación de la misma. Hay una manera mejor de hacer esto?

InformationsquelleAutor robintw | 2012-01-30

2 Kommentare

  1. 22

    Sólo debe ser capaz de utilizar ax.contour o ax.contourf con gráficos polares como lo haría normalmente… tiene un par de errores en el código, sin embargo. Convertir las cosas en radianes, pero, a continuación, utilice los valores en grados cuando la trama. También, que está pasando en r, theta para el contorno de cuando se 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()

    Polar gráfico de contorno en matplotlib - mejor (moderno) manera de hacerlo?

    • Gracias – que es útil. Tengo casi tengo trabajo ahora! Solo una consulta rápida – si eso está bien. Tengo un bucle a través de los azimuts y zeniths para ejecutar mi modelo y salir de mis datos (el modelo implica llamar a otra biblioteca de python) – es la forma en que me estoy haciendo una lista y, a continuación, la remodelación de la matriz, una forma sensata de hacerlo? Hay más python el camino?
    • Hay varias maneras, pero si usted no sabe el tamaño de la matriz antes de la mano, entonces la construcción de una lista y que se convierta en una matriz, al final, es una muy buena solución. También hay numpy.fromiter, lo cual es bueno si usted está corriendo en problemas de memoria. En cuanto al anidada for bucles, usted puede reemplazar con itertools.product, pero eso es en gran medida una cuestión de gusto. Si usted podría vectorización cosas para trabajar con una matriz en lugar de un único valor, que probablemente iba a ver una aceleración. Si usted no puede (debido a la otra biblioteca), entonces usted no puede, sin embargo.
    • Es a menudo limpiador para escribir un simple generador (lo Más probable es una función utilizando yield, en su caso) en lugar de una más «spaghetti-cadena» de la solución, sin embargo. Modular es la mejor 🙂
    • Cómo lidiar con este feo interpolación de caer a lo largo de theta=0 eje?
    • ¿puedo utilizar el mismo enfoque para mi pregunta aquí – scicomp.stackexchange.com/questions/28058/…
    • ¿sabes una manera de añadir un colorbar aquí? Por desgracia, cuando intento ax.colorbar() me sale el error AttributeError: 'PolarAxesSubplot' object has no attribute 'colorbar'

  2. 3

    la forma de x, y y los valores deben ser el mismo. Sus datos de la forma es:

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

    para cambiar contour(x, y, valores) para el contorno de(x, y valores.T).

    • Gracias, que resolvió el problema. ¿Tiene usted alguna idea acerca de las otras partes de la pregunta sobre la mejor manera de hacer polar diagramas de contorno en matplotlib?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea