2017-07-30 100 views
0

绘制太阳位置的常规方法是将小时方位(大致为远离北方的太阳位置)与高程(地平线以上的高度)相对应。在南半球,这意味着方位角从太阳正午的180度(如午夜)到0度不等。但是会议要求下午方位角从360度开始,到午夜时间减少180度。因此,有如下所示的图像中的中午,其中方位角从0到360度进入的突然变化:matplotlib方位角vs仰角 - 原点的不连续性

example figure

我不能找到一种方法来改变x轴在matplotlib( pyplot),以便它在原点有这样的不连续性。有什么建议么?

+0

您可以将数据分成两部分(早上和下午分别)绘制到“轴”的正确区域,然后通过手动设置'xtick_labels'来实现翻转。 –

+0

这似乎工作,但正如你所说,数据看起来不正确。该图表看起来像是海拔与小时的关系图,所以我认为您的方位角计算是错误的。更精确的角度需要计算小时角度和纬度以及纬度。我会看看我是否可以使用我的数据与你的剧情代码。 – icenov

回答

0

您可以将数据分为两部分(早上和下午分开)绘制到Axis的正确区域,然后通过手动设置xtick_labels来实现翻盖。下面的例子,如何做到这一点的原则(数据不看着你的原始图中的数据非常喜欢,虽然):

from matplotlib import pyplot as plt 
import numpy as np 


#latitude: 
lat = -36.55 

#declination: 
def delta(N): 
    return -23.44*np.cos(360/365*(N+10)) 

azimuth_morning = np.linspace(180,0,50) 
azimuth_afternoon = np.linspace(360,180,50) 

def zenith(azimuth, lat, N): 
    return np.rad2deg(np.arcsin(
     np.sin(np.deg2rad(lat))*np.sin(np.deg2rad(delta(N)))+ 
     np.cos(np.deg2rad(lat))*np.cos(np.deg2rad(delta(N)))* 
     np.cos(np.deg2rad(azimuth)) 
    )) 


def plot_sun_arc(ax, N): 
    ax.plot(180+azimuth_morning,zenith(azimuth_morning,lat,N),'k') 
    ax.plot(azimuth_afternoon-180,zenith(azimuth_afternoon,lat,N),'k') 

fig,ax = plt.subplots(figsize=(8,4)) 

for N in range(0,366,60): 
    plot_sun_arc(ax,N) 

xticks = [i for i in range(0,361, 20)] 
xtick_labels = ['{}'.format(t+180) if t < 180 else '{}'.format(t-180) for t in xticks] 

ax.set_xticks(xticks) 
ax.set_xticklabels(xtick_labels) 

ax.set_xlim([0,360]) 
ax.set_ylim([0,90]) 

plt.show() 

由此得出的数字是这样的:

figure that results from the posted code