如何将风向划分为角度以绘制风玫瑰 python
How to divide wind Direction to angles to create wind-rose python plotly
这里我把风向(0到360度)分成16组('N','NNE','NE','ENE','E', 'ESE','SE','SSE','S','SSW','SW','WSW','W','WNW'、'NW'、'NNW')。在我的代码中,N 是 -1 到 22.5,但实际上它应该在 348.75(360-11.25) 和 11.25 之间。为了检查我的结果,我使用 Python Windrose 包和 python plotly px.bar_polar.
绘制了 windrose
带有 windrose 包的 Windrose(pip 安装 windrose):
ws=df.WS
wd=df.WD
ax = WindroseAxes.from_ax()
ax.bar(wd, ws, normed=True, opening=0.8, edgecolor='white')
ax.set_legend()
输出风玫瑰:
但是当我使用 plotly(px.bar_polar) 绘制 windrose 时,它给出了 **不同的 windrose(** 对于相同的数据):
# populate values in new columns
df['WindSpeedkm/h'] = df['WS'] * 3.6
bins = [-1, 10, 20, 30, 40,50, np.inf]
names = ['0-10 km/h', '10-20 km/h', '20-30 km/h', '30-40 km/h', '40-50 km/h','>50 km/h']
df['speed_kmhRange'] = pd.cut(df['WindSpeedkm/h'], bins, labels=names)
bins = [-1, 22.5,45,67.5,90,112.5,135,157.5,180,202.5,225,247.5,270,292.5,315,337.5,361]
names = ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW']
输出风玫瑰:
我知道这个错误是由于我之前提到的对角度进行分组造成的,但是我该如何解决这个问题?我需要使用 python 来绘制所需的输出。
东风:
{'WS': {0: 4.87,
1: 4.87,
2: 4.91,
3: 4.97,
4: 5.06,
6: 0.21,
7: 7.06,
8: 6.62,
10: 6.69,
11: 7.0,
12: 7.37,
13: 7.41,
14: 7.44,
15: 7.41,
16: 7.16,
17: 6.69,
18: 6.19,
19: 5.91,
20: 5.81,
21: 5.75,
22: 5.72,
23: 5.72,
24: 5.72,
25: 0.37,
26: 5.91,
27: 6.09,
28: 6.28,
29: 6.28,
30: 6.25,
31: 6.03,
32: 5.81,
33: 5.59,
34: 5.56,
35: 5.34,
36: 5.09,
37: 4.87,
38: 4.84,
40: 4.84,
41: 5.09,
42: 5.69,
43: 5.75,
44: 5.78,
45: 5.75,
46: 5.5,
47: 5.28,
48: 5.09,
49: 5.09,
50: 5.12,
51: 5.12,
52: 5.12,
53: 5.12,
54: 5.22,
55: 5.37,
56: 5.56,
57: 5.56,
59: 5.53,
60: 5.5,
61: 5.53,
62: 5.62,
63: 5.69,
64: 5.69,
65: 5.62,
66: 5.34,
67: 5.09,
68: 4.75,
69: 4.69,
70: 4.72,
71: 4.75,
72: 4.75,
73: 0.0,
74: 4.72,
75: 4.72,
76: 4.91,
77: 5.16,
78: 5.41,
79: 5.44,
80: 5.5,
81: 5.53,
82: 5.44,
83: 5.34,
84: 5.31,
85: 5.25,
86: 5.19,
87: 5.12,
89: 5.09,
90: 5.06,
91: 5.12,
92: 5.41,
93: 5.69,
94: 6.0,
95: 6.09,
96: 6.12,
97: 6.09,
98: 6.09,
99: 6.28,
100: 6.5,
101: 6.69,
102: 6.5,
104: 6.34,
105: 6.47,
106: 6.78,
107: 7.03,
108: 7.03,
109: 7.0,
111: 7.06,
112: 7.03,
113: 6.81,
114: 6.56,
115: 6.34,
116: 6.28,
117: 6.25,
118: 6.25,
120: 6.34,
121: 6.41,
122: 6.44,
123: 6.44,
124: 6.47,
125: 6.81,
126: 7.09,
127: 7.16,
128: 6.97,
129: 6.75,
130: 6.75,
131: 7.0,
132: 7.28,
133: 7.69,
135: 7.91,
136: 8.06,
137: 7.78,
138: 6.78,
139: 6.5,
140: 6.22,
141: 5.56,
142: 4.91,
143: 4.75,
144: 5.03,
145: 5.31,
146: 5.37,
147: 5.41,
148: 5.44,
149: 0.29,
150: 5.72,
151: 5.97,
152: 6.28,
153: 6.25,
154: 6.22,
155: 6.22,
156: 6.25,
157: 6.31,
158: 6.34,
159: 6.37,
160: 6.16,
161: 5.87,
162: 5.62,
163: 5.78,
165: 5.94,
166: 5.81,
167: 5.53,
168: 5.28,
169: 5.22,
170: 5.22,
171: 5.22,
172: 5.22,
173: 5.28,
174: 5.34,
175: 5.44,
176: 5.69,
177: 5.91,
178: 5.87,
179: 0.29,
180: 5.53,
181: 5.56,
182: 5.59,
183: 5.62,
184: 5.66,
185: 5.69,
186: 5.72,
187: 5.75,
188: 5.75,
189: 5.78,
190: 5.81,
191: 5.84,
192: 5.87,
193: 6.0,
194: 6.03,
195: 6.03,
196: 6.06,
197: 6.12,
198: 6.19,
199: 6.41,
200: 6.62,
201: 6.81,
202: 6.87,
203: 6.91,
204: 6.97,
206: 7.22,
207: 8.31,
208: 8.69,
209: 8.69,
210: 8.25},
'WD': {0: 358.56,
1: 1.16,
2: 2.87,
3: 4.31,
4: 5.55,
6: 281.27,
7: 1.02,
8: 359.84,
10: 357.78,
11: 357.2,
12: 356.2,
13: 357.82,
14: 1.04,
15: 2.93,
16: 3.83,
17: 4.85,
18: 6.42,
19: 8.91,
20: 10.37,
21: 9.92,
22: 8.24,
23: 6.57,
24: 6.36,
25: 270.67,
26: 8.14,
27: 10.49,
28: 11.55,
29: 11.76,
30: 13.27,
31: 15.64,
32: 17.75,
33: 20.26,
34: 22.77,
35: 24.25,
36: 23.99,
37: 21.69,
38: 19.18,
40: 17.07,
41: 16.1,
42: 15.73,
43: 14.93,
44: 13.6,
45: 13.07,
46: 13.27,
47: 14.32,
48: 16.79,
49: 19.34,
50: 19.89,
51: 17.7,
52: 14.05,
53: 11.39,
54: 13.13,
55: 15.91,
56: 17.48,
57: 17.82,
59: 17.57,
60: 17.23,
61: 16.72,
62: 14.69,
63: 12.13,
64: 10.01,
65: 8.81,
66: 7.51,
67: 5.69,
68: 4.01,
69: 6.87,
70: 10.57,
71: 13.5,
72: 14.15,
73: 3.11,
74: 13.04,
75: 10.81,
76: 7.27,
77: 3.99,
78: 1.13,
79: 359.69,
80: 359.27,
81: 359.09,
82: 1.77,
83: 3.01,
84: 2.77,
85: 1.24,
86: 359.84,
87: 359.04,
89: 358.02,
90: 359.94,
91: 358.87,
92: 357.51,
93: 357.85,
94: 359.33,
95: 0.54,
96: 1.54,
97: 2.19,
98: 3.58,
99: 5.73,
100: 7.51,
101: 8.63,
102: 9.29,
104: 10.89,
105: 13.9,
106: 18.03,
107: 21.25,
108: 22.94,
109: 22.73,
111: 16.53,
112: 12.06,
113: 8.73,
114: 7.4,
115: 8.46,
116: 10.71,
117: 12.32,
118: 13.99,
120: 16.41,
121: 21.16,
122: 26.01,
123: 29.35,
124: 29.24,
125: 13.66,
126: 7.49,
127: 8.61,
128: 9.95,
129: 10.22,
130: 8.68,
131: 5.71,
132: 2.72,
133: 359.88,
135: 357.9,
136: 355.18,
137: 353.98,
138: 355.36,
139: 355.09,
140: 353.57,
141: 352.17,
142: 355.87,
143: 357.23,
144: 359.79,
145: 359.94,
146: 358.07,
147: 358.04,
148: 1.58,
149: 279.41,
150: 4.73,
151: 7.84,
152: 10.57,
153: 10.43,
154: 9.5,
155: 7.4,
156: 5.26,
157: 3.31,
158: 1.75,
159: 358.62,
160: 350.52,
161: 345.59,
162: 341.33,
163: 350.82,
165: 359.53,
166: 3.81,
167: 2.9,
168: 3.86,
169: 13.1,
170: 23.17,
171: 31.06,
172: 30,
173: 25.04,
174: 19.94,
175: 15.79,
176: 14.27,
177: 13.06,
178: 11.6,
179: 279.44,
180: 9.74,
181: 10.06,
182: 10.05,
183: 8.97,
184: 6.87,
185: 4.44,
186: 2.6,
187: 1.47,
188: 1.27,
189: 2.29,
190: 3.58,
191: 3.14,
192: 0.98,
193: 359.71,
194: 2.94,
195: 6.95,
196: 11.27,
197: 14.19,
198: 15.72,
199: 15.46,
200: 14.33,
201: 12.98,
202: 11.27,
203: 9.73,
204: 8.73,
206: 8.59,
207: 8.51,
208: 7.7,
209: 7.22,
210: 7.27}}
如果我没理解错的话,你的问题是关于创建 16 个 bin,其中一个 bin 的范围是 348.75 到 11.25。
要解决这个问题,您可以创建 17 个垃圾箱。第一个 bin 的范围从 0 到 11.25,最后一个 bin 的范围从 348.75 到 360。
由于 pd.cut()
要求每个垃圾桶都有一个唯一的标签,因此尽管它们代表相同的方向,但您必须将最后一个垃圾桶命名为与第一个垃圾桶不同的名称,即将它们标记为 N
和 N2
.
在合并后的附加步骤中,您可以将 N2
重命名为 N
.
bins = np.linspace(0, 360, 17)+11.25
bins = np.insert(bins, 0, 0)
names = ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW', 'N2']
df['wind_dir_Range'] = pd.cut(df['WD'], bins, labels=names)
df['wind_dir_Range'] = df['wind_dir_Range'].replace('N2', 'N')
这里我把风向(0到360度)分成16组('N','NNE','NE','ENE','E', 'ESE','SE','SSE','S','SSW','SW','WSW','W','WNW'、'NW'、'NNW')。在我的代码中,N 是 -1 到 22.5,但实际上它应该在 348.75(360-11.25) 和 11.25 之间。为了检查我的结果,我使用 Python Windrose 包和 python plotly px.bar_polar.
绘制了 windrose带有 windrose 包的 Windrose(pip 安装 windrose):
ws=df.WS
wd=df.WD
ax = WindroseAxes.from_ax()
ax.bar(wd, ws, normed=True, opening=0.8, edgecolor='white')
ax.set_legend()
输出风玫瑰:
但是当我使用 plotly(px.bar_polar) 绘制 windrose 时,它给出了 **不同的 windrose(** 对于相同的数据):
# populate values in new columns
df['WindSpeedkm/h'] = df['WS'] * 3.6
bins = [-1, 10, 20, 30, 40,50, np.inf]
names = ['0-10 km/h', '10-20 km/h', '20-30 km/h', '30-40 km/h', '40-50 km/h','>50 km/h']
df['speed_kmhRange'] = pd.cut(df['WindSpeedkm/h'], bins, labels=names)
bins = [-1, 22.5,45,67.5,90,112.5,135,157.5,180,202.5,225,247.5,270,292.5,315,337.5,361]
names = ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW']
输出风玫瑰:
我知道这个错误是由于我之前提到的对角度进行分组造成的,但是我该如何解决这个问题?我需要使用 python 来绘制所需的输出。
东风:
{'WS': {0: 4.87,
1: 4.87,
2: 4.91,
3: 4.97,
4: 5.06,
6: 0.21,
7: 7.06,
8: 6.62,
10: 6.69,
11: 7.0,
12: 7.37,
13: 7.41,
14: 7.44,
15: 7.41,
16: 7.16,
17: 6.69,
18: 6.19,
19: 5.91,
20: 5.81,
21: 5.75,
22: 5.72,
23: 5.72,
24: 5.72,
25: 0.37,
26: 5.91,
27: 6.09,
28: 6.28,
29: 6.28,
30: 6.25,
31: 6.03,
32: 5.81,
33: 5.59,
34: 5.56,
35: 5.34,
36: 5.09,
37: 4.87,
38: 4.84,
40: 4.84,
41: 5.09,
42: 5.69,
43: 5.75,
44: 5.78,
45: 5.75,
46: 5.5,
47: 5.28,
48: 5.09,
49: 5.09,
50: 5.12,
51: 5.12,
52: 5.12,
53: 5.12,
54: 5.22,
55: 5.37,
56: 5.56,
57: 5.56,
59: 5.53,
60: 5.5,
61: 5.53,
62: 5.62,
63: 5.69,
64: 5.69,
65: 5.62,
66: 5.34,
67: 5.09,
68: 4.75,
69: 4.69,
70: 4.72,
71: 4.75,
72: 4.75,
73: 0.0,
74: 4.72,
75: 4.72,
76: 4.91,
77: 5.16,
78: 5.41,
79: 5.44,
80: 5.5,
81: 5.53,
82: 5.44,
83: 5.34,
84: 5.31,
85: 5.25,
86: 5.19,
87: 5.12,
89: 5.09,
90: 5.06,
91: 5.12,
92: 5.41,
93: 5.69,
94: 6.0,
95: 6.09,
96: 6.12,
97: 6.09,
98: 6.09,
99: 6.28,
100: 6.5,
101: 6.69,
102: 6.5,
104: 6.34,
105: 6.47,
106: 6.78,
107: 7.03,
108: 7.03,
109: 7.0,
111: 7.06,
112: 7.03,
113: 6.81,
114: 6.56,
115: 6.34,
116: 6.28,
117: 6.25,
118: 6.25,
120: 6.34,
121: 6.41,
122: 6.44,
123: 6.44,
124: 6.47,
125: 6.81,
126: 7.09,
127: 7.16,
128: 6.97,
129: 6.75,
130: 6.75,
131: 7.0,
132: 7.28,
133: 7.69,
135: 7.91,
136: 8.06,
137: 7.78,
138: 6.78,
139: 6.5,
140: 6.22,
141: 5.56,
142: 4.91,
143: 4.75,
144: 5.03,
145: 5.31,
146: 5.37,
147: 5.41,
148: 5.44,
149: 0.29,
150: 5.72,
151: 5.97,
152: 6.28,
153: 6.25,
154: 6.22,
155: 6.22,
156: 6.25,
157: 6.31,
158: 6.34,
159: 6.37,
160: 6.16,
161: 5.87,
162: 5.62,
163: 5.78,
165: 5.94,
166: 5.81,
167: 5.53,
168: 5.28,
169: 5.22,
170: 5.22,
171: 5.22,
172: 5.22,
173: 5.28,
174: 5.34,
175: 5.44,
176: 5.69,
177: 5.91,
178: 5.87,
179: 0.29,
180: 5.53,
181: 5.56,
182: 5.59,
183: 5.62,
184: 5.66,
185: 5.69,
186: 5.72,
187: 5.75,
188: 5.75,
189: 5.78,
190: 5.81,
191: 5.84,
192: 5.87,
193: 6.0,
194: 6.03,
195: 6.03,
196: 6.06,
197: 6.12,
198: 6.19,
199: 6.41,
200: 6.62,
201: 6.81,
202: 6.87,
203: 6.91,
204: 6.97,
206: 7.22,
207: 8.31,
208: 8.69,
209: 8.69,
210: 8.25},
'WD': {0: 358.56,
1: 1.16,
2: 2.87,
3: 4.31,
4: 5.55,
6: 281.27,
7: 1.02,
8: 359.84,
10: 357.78,
11: 357.2,
12: 356.2,
13: 357.82,
14: 1.04,
15: 2.93,
16: 3.83,
17: 4.85,
18: 6.42,
19: 8.91,
20: 10.37,
21: 9.92,
22: 8.24,
23: 6.57,
24: 6.36,
25: 270.67,
26: 8.14,
27: 10.49,
28: 11.55,
29: 11.76,
30: 13.27,
31: 15.64,
32: 17.75,
33: 20.26,
34: 22.77,
35: 24.25,
36: 23.99,
37: 21.69,
38: 19.18,
40: 17.07,
41: 16.1,
42: 15.73,
43: 14.93,
44: 13.6,
45: 13.07,
46: 13.27,
47: 14.32,
48: 16.79,
49: 19.34,
50: 19.89,
51: 17.7,
52: 14.05,
53: 11.39,
54: 13.13,
55: 15.91,
56: 17.48,
57: 17.82,
59: 17.57,
60: 17.23,
61: 16.72,
62: 14.69,
63: 12.13,
64: 10.01,
65: 8.81,
66: 7.51,
67: 5.69,
68: 4.01,
69: 6.87,
70: 10.57,
71: 13.5,
72: 14.15,
73: 3.11,
74: 13.04,
75: 10.81,
76: 7.27,
77: 3.99,
78: 1.13,
79: 359.69,
80: 359.27,
81: 359.09,
82: 1.77,
83: 3.01,
84: 2.77,
85: 1.24,
86: 359.84,
87: 359.04,
89: 358.02,
90: 359.94,
91: 358.87,
92: 357.51,
93: 357.85,
94: 359.33,
95: 0.54,
96: 1.54,
97: 2.19,
98: 3.58,
99: 5.73,
100: 7.51,
101: 8.63,
102: 9.29,
104: 10.89,
105: 13.9,
106: 18.03,
107: 21.25,
108: 22.94,
109: 22.73,
111: 16.53,
112: 12.06,
113: 8.73,
114: 7.4,
115: 8.46,
116: 10.71,
117: 12.32,
118: 13.99,
120: 16.41,
121: 21.16,
122: 26.01,
123: 29.35,
124: 29.24,
125: 13.66,
126: 7.49,
127: 8.61,
128: 9.95,
129: 10.22,
130: 8.68,
131: 5.71,
132: 2.72,
133: 359.88,
135: 357.9,
136: 355.18,
137: 353.98,
138: 355.36,
139: 355.09,
140: 353.57,
141: 352.17,
142: 355.87,
143: 357.23,
144: 359.79,
145: 359.94,
146: 358.07,
147: 358.04,
148: 1.58,
149: 279.41,
150: 4.73,
151: 7.84,
152: 10.57,
153: 10.43,
154: 9.5,
155: 7.4,
156: 5.26,
157: 3.31,
158: 1.75,
159: 358.62,
160: 350.52,
161: 345.59,
162: 341.33,
163: 350.82,
165: 359.53,
166: 3.81,
167: 2.9,
168: 3.86,
169: 13.1,
170: 23.17,
171: 31.06,
172: 30,
173: 25.04,
174: 19.94,
175: 15.79,
176: 14.27,
177: 13.06,
178: 11.6,
179: 279.44,
180: 9.74,
181: 10.06,
182: 10.05,
183: 8.97,
184: 6.87,
185: 4.44,
186: 2.6,
187: 1.47,
188: 1.27,
189: 2.29,
190: 3.58,
191: 3.14,
192: 0.98,
193: 359.71,
194: 2.94,
195: 6.95,
196: 11.27,
197: 14.19,
198: 15.72,
199: 15.46,
200: 14.33,
201: 12.98,
202: 11.27,
203: 9.73,
204: 8.73,
206: 8.59,
207: 8.51,
208: 7.7,
209: 7.22,
210: 7.27}}
如果我没理解错的话,你的问题是关于创建 16 个 bin,其中一个 bin 的范围是 348.75 到 11.25。
要解决这个问题,您可以创建 17 个垃圾箱。第一个 bin 的范围从 0 到 11.25,最后一个 bin 的范围从 348.75 到 360。
由于 pd.cut()
要求每个垃圾桶都有一个唯一的标签,因此尽管它们代表相同的方向,但您必须将最后一个垃圾桶命名为与第一个垃圾桶不同的名称,即将它们标记为 N
和 N2
.
在合并后的附加步骤中,您可以将 N2
重命名为 N
.
bins = np.linspace(0, 360, 17)+11.25
bins = np.insert(bins, 0, 0)
names = ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW', 'N2']
df['wind_dir_Range'] = pd.cut(df['WD'], bins, labels=names)
df['wind_dir_Range'] = df['wind_dir_Range'].replace('N2', 'N')