Tengo un conjunto de datos que quiero usar para producir un diagrama de contorno en coordenadas polares usando Matplotlib.
Mis datos son los siguientes:
theta
- 1D matriz de valores de ánguloradius
- 1D matriz de valores de radiovalue
- 1D matriz de valores que quiero usar para los contornos
Estas son todas las matrices 1D que se alinean correctamente, por ejemplo:
theta radius value
30 1 2.9
30 2 5.3
35 5 9.2
Es decir, todos los valores se repiten suficientes veces para que cada fila de esta "tabla" de tres variables defina un punto.
¿Cómo puedo crear un diagrama de contorno polar a partir de estos¿valores? He pensado convertir los valores de radio y theta en valores x e y y hacerlo en coordenadas cartesianas, pero la función de contorno parece requerir matrices 2D, y no puedo entender por qué.
¿Algunas ideas?
Respuestas
8 para la respuesta № 1Matplotlib "s contour()
La función espera que los datos se organicen como una cuadrícula 2Dde puntos y la cuadrícula de valores correspondiente para cada uno de esos puntos de cuadrícula. Si sus datos están dispuestos naturalmente en una cuadrícula, puede convertir r, theta a x, y usar contour(r*np.cos(theta), r*np.sin(theta), values)
para hacer tu trama.
Si sus datos no están cuadriculados naturalmente, debe seguir los consejos de Stephen y utilizar griddata()
para interpolar sus datos en una cuadrícula.
El siguiente script muestra ejemplos de ambos.
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()
3 para la respuesta № 2
No sé si es posible hacer un diagrama de contorno polar directamente, pero si convierte a coordenadas cartesianas puede usar el griddata
función para convertir sus matrices 1D a 2D.