xlabel - polar plot python
¿Cómo hacer que los ángulos en una trama polar matplotlib vayan en sentido horario con 0 ° en la parte superior? (5)
Actualizando esta pregunta, en Matplotlib 1.1, ahora hay dos métodos en PolarAxes
para establecer la dirección theta (CW / CCW) y la ubicación para theta = 0.
Específicamente, vea set_theta_direction()
y set_theta_offset()
.
Parece que mucha gente intenta hacer complots tipo brújula.
Estoy usando matplotlib y numpy para hacer una trama polar. Aquí hay un código de muestra:
import numpy as N
import matplotlib.pyplot as P
angle = N.arange(0, 360, 10, dtype=float) * N.pi / 180.0
arbitrary_data = N.abs(N.sin(angle)) + 0.1 * (N.random.random_sample(size=angle.shape) - 0.5)
P.clf()
P.polar(angle, arbitrary_data)
P.show()
Notará que 0 ° es a las 3 en punto en la trama, y los ángulos van en sentido antihorario. Sería más útil para mis propósitos de visualización de datos tener 0 ° a las 12 en punto y tener los ángulos en el sentido de las agujas del reloj. ¿Hay alguna manera de hacer esto además de rotar los datos y cambiar manualmente las etiquetas de los ejes?
Ambas rutinas invertidas deberían usar la ruta completa a las transformadas:
return NorthPolarAxes.InvertedNorthPolarTransform()
y
return NorthPolarAxes.NorthPolarTransform()
Ahora, las subclases creadas automáticamente de NorthPolarAxes como NorthPolarAxesSubplot pueden acceder a las funciones de transformación.
Espero que esto ayude.
Lo descubrí: matplotlib te permite crear proyecciones personalizadas. PolarAxes
uno que hereda de PolarAxes
.
import numpy as N
import matplotlib.pyplot as P
from matplotlib.projections import PolarAxes, register_projection
from matplotlib.transforms import Affine2D, Bbox, IdentityTransform
class NorthPolarAxes(PolarAxes):
''''''
A variant of PolarAxes where theta starts pointing north and goes
clockwise.
''''''
name = ''northpolar''
class NorthPolarTransform(PolarAxes.PolarTransform):
def transform(self, tr):
xy = N.zeros(tr.shape, N.float_)
t = tr[:, 0:1]
r = tr[:, 1:2]
x = xy[:, 0:1]
y = xy[:, 1:2]
x[:] = r * N.sin(t)
y[:] = r * N.cos(t)
return xy
transform_non_affine = transform
def inverted(self):
return NorthPolarAxes.InvertedNorthPolarTransform()
class InvertedNorthPolarTransform(PolarAxes.InvertedPolarTransform):
def transform(self, xy):
x = xy[:, 0:1]
y = xy[:, 1:]
r = N.sqrt(x*x + y*y)
theta = N.arctan2(y, x)
return N.concatenate((theta, r), 1)
def inverted(self):
return NorthPolarAxes.NorthPolarTransform()
def _set_lim_and_transforms(self):
PolarAxes._set_lim_and_transforms(self)
self.transProjection = self.NorthPolarTransform()
self.transData = (
self.transScale +
self.transProjection +
(self.transProjectionAffine + self.transAxes))
self._xaxis_transform = (
self.transProjection +
self.PolarAffine(IdentityTransform(), Bbox.unit()) +
self.transAxes)
self._xaxis_text1_transform = (
self._theta_label1_position +
self._xaxis_transform)
self._yaxis_transform = (
Affine2D().scale(N.pi * 2.0, 1.0) +
self.transData)
self._yaxis_text1_transform = (
self._r_label1_position +
Affine2D().scale(1.0 / 360.0, 1.0) +
self._yaxis_transform)
register_projection(NorthPolarAxes)
angle = N.arange(0, 360, 10, dtype=float) * N.pi / 180.0
arbitrary_data = (N.abs(N.sin(angle)) + 0.1 *
(N.random.random_sample(size=angle.shape) - 0.5))
P.clf()
P.subplot(1, 1, 1, projection=''northpolar'')
P.plot(angle, arbitrary_data)
P.show()
Para expandir la respuesta de klimaat con un ejemplo:
import math
angle=[0.,5.,10.,15.,20.,25.,30.,35.,40.,45.,50.,55.,60.,65.,70.,75.,/
80.,85.,90.,95.,100.,105.,110.,115.,120.,125.]
angle = [math.radians(a) for a in angle]
lux=[12.67,12.97,12.49,14.58,12.46,12.59,11.26,10.71,17.74,25.95,/
15.07,7.43,6.30,6.39,7.70,9.19,11.30,13.30,14.07,15.92,14.70,/
10.70,6.27,2.69,1.29,0.81]
import matplotlib.pyplot as P
import matplotlib
P.clf()
sp = P.subplot(1, 1, 1, projection=''polar'')
sp.set_theta_zero_location(''N'')
sp.set_theta_direction(-1)
P.plot(angle, lux)
P.show()
Puede modificar su matplotlib / projections / polar.py.
En donde dice:
def transform(self, tr):
xy = npy.zeros(tr.shape, npy.float_)
t = tr[:, 0:1]
r = tr[:, 1:2]
x = xy[:, 0:1]
y = xy[:, 1:2]
x[:] = r * npy.cos(t)
y[:] = r * npy.sin(t)
return xy
Hazlo decir:
def transform(self, tr):
xy = npy.zeros(tr.shape, npy.float_)
t = tr[:, 0:1]
r = tr[:, 1:2]
x = xy[:, 0:1]
y = xy[:, 1:2]
x[:] = - r * npy.sin(t)
y[:] = r * npy.cos(t)
return xy
En realidad, no lo intenté, es posible que deba ajustar las asignaciones x [:] e y [:] a su gusto. Este cambio afectará a todos los programas que usan matplotlib polar plot.