-
Notifications
You must be signed in to change notification settings - Fork 0
/
WindRose.py
104 lines (83 loc) · 3.98 KB
/
WindRose.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
##########################################################################################
# PyClim was developed by Prof. Darren Robinson (University of Sheffield, 2019). #
# PyClim produces a range of graphs and statistics to support the analysis of climate #
# data, for architectural / engineering / technology students to develop their #
# early-stage bioclimatic design concepts. #
##########################################################################################
#THIS MODULE SIMPLY CREATES A POLAR WIND ROSE PLOT.
import math
import matplotlib.pyplot as plt
import numpy as np
from ClimAnalFunctions import *
########################################################
#The following control the format of the windrose
########################################################
#This determines whether the radial axis goes from cntre outwards or vice-versa
invert_radialaxis=False
#This sets the number of azimuthal sectors to plot
numsectors = 16
#These set the lower and upper bounds of the colormap
upper_percentile_limit = 85
lower_percentile_limit = 5
#This determines whether temperature or wind speed is plotted
PlotTemp = False
#Wind speeds are potted at 1m/s intervals: TempInterval sets the temperature intervals
#THIS IS NOT USED YET: LISTS TO BE MODIFIED TO ACCOUNT FOR REDUCED LENGTH ONCE RANGE IS
#DIVIDED BY INTERVALS [AS WITH W-DIR AND SECTORNUM]. THE Y-SCALE WILL ALSO NEED A MULTIPLIER.
TempInterval = 2.5
#this reads climate data file
winspeed_list= []
windir_list = []
temp_list = []
file_list = []
for line in file:
line = line.rstrip('\n')
line = line.split(',')
file_list.append(line)
file.close()
#this popuates lists with the corresponding data
for i in range (3, len(file_list)):
temp_list.append(float(file_list[i][3]))
winspeed_list.append(float(file_list[i][7]))
windir_list.append(float(file_list[i][8]))
maxspeed = int(max(winspeed_list))
maxtemp = int(max(temp_list))
mintemp = int(min(temp_list))
azimuth_list = np.linspace(0, 360, (numsectors+1))
zenith_list = np.linspace(0,maxspeed+1,(maxspeed+1))
tempzen_list = np.linspace(mintemp,maxtemp+1,(maxtemp-mintemp+1))
value_list = [[0 for i in range(numsectors+1)] for j in range(maxspeed+1)]
tempval_list = [[0 for i in range(numsectors+1)] for j in range(maxtemp-mintemp+1)]
for j in range (0,8760):
sectornum = int(windir_list[j]/(360/numsectors))
speednum=int(winspeed_list[j])
tempnum=int(temp_list[j])
zval = value_list[speednum][sectornum]
zpval = tempval_list[tempnum][sectornum]
value_list[speednum][sectornum] = zval+1
tempval_list[tempnum][sectornum] = zpval+1
value_list[0][0]=0
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
azimuth_list = np.radians(azimuth_list)
if PlotTemp == False:
#NB: The jet cmap gives very good discrimination:
cp = ax.pcolormesh(azimuth_list, zenith_list, value_list, cmap='jet') #'plasma', 'magma', 'jet' and 'viridis' are good cmaps
ax.set_title('Annual Wind Rose: with wind speed in radial sectors')
ax.set_theta_zero_location("N")
ax.set_theta_direction(-1)
ax.set_ylim([int(np.percentile(winspeed_list,lower_percentile_limit)), int(np.percentile(winspeed_list,upper_percentile_limit))])
if invert_radialaxis==True:
ax.set_ylim(plt.ylim()[::-1])
fig.colorbar(cp, label = 'Annual hours: wind approaching from ith direction at jth speed')
else:
cp = ax.pcolormesh(azimuth_list, tempzen_list, tempval_list, cmap='jet')
ax.set_title('Annual Wind Rose: with temperature in radial sectors')
ax.set_theta_zero_location("N")
ax.set_theta_direction(-1)
ax.set_ylim([int(np.percentile(temp_list,lower_percentile_limit)), int(np.percentile(temp_list,upper_percentile_limit))])
if invert_radialaxis==True:
ax.set_ylim(plt.ylim()[::-1])
# ax.set_yticklabels([])
fig.colorbar(cp, label = 'Annual hours: wind approaching from ith direction at jth temperature')
plt.tight_layout()
plt.show()