Стереографическая диаграмма солнца matplotlib полярный сюжет python

Я пытаюсь создать простую стереографическую диаграмму пути солнца, подобную этой: com/wiki/Sun-Path_Diagram

Я могу повернуть полярный график и установить масштаб на 90. Как мне перевернуть ось Y? В настоящее время ось идет от 0> 90, как мне повернуть ось на 90> 0, чтобы представить азимут?

Я пытался:

ax.invert_yaxis()
ax.yaxis_inverted()

Кроме того, как мне создать стереографическую проекцию, а не равноудаленную?

Мой код:

import matplotlib.pylab as plt
testFig = plt.figure(1, figsize=(8,8))
rect = [0.1,0.1,0.8,0.8]
testAx = testFig.add_axes(rect,polar=True)
testAx.invert_yaxis()
testAx.set_theta_zero_location('N')
testAx.set_theta_direction(-1)

Azi = [90,180,270]
Alt= [0,42,0]
testAx.plot(Azi,Alt)
plt.show()

В настоящее время мой код, кажется, даже не правильно рисует линии, мне нужно преобразовать угол или градусы во что-то еще?

Любая помощь приветствуется.


person ivvv    schedule 12.10.2012    source источник
comment
Короткий ответ: вам нужна стереографическая проекция вместо полярной проекции. Однако это означает, что вам придется либо а) создать подкласс Axes самостоятельно (посмотрите projections.geo_axes в matplotlib, либо б) адаптировать существующий код, чтобы он делал то, что вы хотите. (Просто чтобы подключить что-то свое, mplstereonet: github.com/joferkington/mplstereonet можно адаптировать к это, но он предназначен для геологических данных.) Я занят в течение следующих дня или двух, но я попытаюсь опубликовать пример обоих, если кто-то не опередит меня. :)   -  person Joe Kington    schedule 13.10.2012
comment
После долгих поисков в Интернете я думаю, что может быть достаточно поиграться с y_scale: Пример ScaleBase. Хотя я не уверен, что обратная шкала будет работать. Будет держать вас в курсе.   -  person ivvv    schedule 16.10.2012
comment
@tcaswell привет, см. ответ ниже.   -  person ivvv    schedule 10.01.2013


Ответы (1)


Наконец-то у меня появилось время поиграться с matplotlib. После долгих поисков правильный путь, как указывает Джо Кингтон, - это подкласс топоров. Я нашел гораздо более быстрый способ, используя отличный модуль базовой карты.

Ниже приведен код, который я адаптировал для stackoverflow. Высота и азимут солнца были рассчитаны с помощью Pysolar с набором временных меток, созданных в пандах.

import matplotlib.pylab as plt
from mpl_toolkits.basemap import Basemap
import numpy as np

winterAzi = datafomPySolarAzi
winterAlt = datafromPySolarAlt

# create instance of basemap, note we want a south polar projection to 90 = E
myMap = Basemap(projection='spstere',boundinglat=0,lon_0=180,resolution='l',round=True,suppress_ticks=True)
# set the grid up
gridX,gridY = 10.0,15.0
parallelGrid = np.arange(-90.0,90.0,gridX)
meridianGrid = np.arange(-180.0,180.0,gridY)

# draw parallel and meridian grid, not labels are off. We have to manually create these.
myMap.drawparallels(parallelGrid,labels=[False,False,False,False])
myMap.drawmeridians(meridianGrid,labels=[False,False,False,False],labelstyle='+/-',fmt='%i')

# we have to send our values through basemap to convert coordinates, note -winterAlt
winterX,winterY = myMap(winterAzi,-winterAlt)

# plot azimuth labels, with a North label.
ax = plt.gca()
ax.text(0.5,1.025,'N',transform=ax.transAxes,horizontalalignment='center',verticalalignment='bottom',size=25)
for para in np.arange(gridY,360,gridY):
    x= (1.1*0.5*np.sin(np.deg2rad(para)))+0.5
    y= (1.1*0.5*np.cos(np.deg2rad(para)))+0.5
    ax.text(x,y,u'%i\N{DEGREE SIGN}'%para,transform=ax.transAxes,horizontalalignment='center',verticalalignment='center')


# plot the winter values
myMap.plot(winterX,winterY ,'bo')

Обратите внимание, что в настоящее время я рисую только точки, вам нужно будет убедиться, что точки линии имеют точку на высоте 0 на восходе/закате.

стереографический сюжет, обратите внимание, что я зарисовал зимнее/летнее солнцестояние и осеннее равноденствие

person ivvv    schedule 10.01.2013