Как сделать углы в полярном графике matplotlib идти по часовой стрелке с 0 ° вверху?

Я использую matplotlib и numpy для создания полярного сюжета. Вот пример кода:

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() 

Вы заметите, что 0 ° находится на 3 часа на графике, а углы идут против часовой стрелки. Для моих целей визуализации данных было бы более полезно иметь 0 ° в 12 часов и иметь углы по часовой стрелке. Есть ли способ сделать это, помимо вращения данных и ручного изменения меток оси?

  • Сравнение времени в UTC со временем в восточном времени с использованием Python
  • связать несколько команд Popen с трубами
  • Текстовая игра Python: как сделать функцию сохранения?
  • Python - конвертировать дату в ISO 8601
  • python re.sub group: число после \ число
  • Проблема сборки Matplotlib: ошибка C1083: невозможно открыть файл include: 'ft2build.h'
  • QT QItemSelectionModel игнорировать столбцы?
  • Захват SIGINT с использованием исключения KeyboardInterrupt работает в терминале, а не в скрипте
  • 5 Solutions collect form web for “Как сделать углы в полярном графике matplotlib идти по часовой стрелке с 0 ° вверху?”

    Обновление этого вопроса, в Matplotlib 1.1, теперь есть два метода в PolarAxes для установки направления theta (CW / CCW) и местоположения для theta = 0.

    Проверьте http://matplotlib.sourceforge.net/devel/add_new_projection.html#matplotlib.projections.polar.PolarAxes

    В частности, см. set_theta_direction() и set_theta_offset() .

    Похоже, многие люди пытаются делать компасные сюжеты.

    Я нашел это – matplotlib позволяет создавать пользовательские прогнозы. Я создал тот, который наследуется от 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() по 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() 

    Чтобы расширить ответ klimaat на примере:

     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() . 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() 

    Вы можете изменить ваш matplotlib / projectionions / polar.py.

    Где он говорит:

     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 

    Сделайте так:

     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 

    Я на самом деле не пытался это сделать, вам может потребоваться настроить x [:] и y [:] задания на ваш вкус. Это изменение повлияет на все программы, которые используют полярный график matplotlib.

    Оба метода инвертирования должны использовать полный путь к преобразованиям:

     return NorthPolarAxes.InvertedNorthPolarTransform() 

    а также

     return NorthPolarAxes.NorthPolarTransform() 

    Теперь автоматически создаваемые подклассы NorthPolarAxes, такие как NorthPolarAxesSubplot, могут обращаться к функциям преобразования.

    Надеюсь это поможет.

    Python - лучший язык программирования в мире.