已经可以初步满足需求了,不过我们发现N位置差了90°,而且为了满足‘上北下南左西右东’的习惯,需要逆时针方向绘制。所以做两个修改:
N = 16 # 风速分布为16个方向 theta = np.linspace(0, 2*np.pi, N, endpoint=False) # 获取16个方向的角度值 width = np.pi / N # 绘制扇型的宽度,可以自行调整 labels = list(data.columns) # 自定义坐标标签为 N , NSN, …… # 开始绘图 plt.figure(figsize=(8,8)) ax = plt.subplot(111, projection='polar') for idx in data.index: # 每一行绘制一个扇形 radii = data.loc[idx] # 每一行数据 ax.bar(theta, radii, width=width, bottom=0.0, label=idx, tick_label=labels) #------------------------------------# ax.set_theta_zero_location('N') #设置零度方向北 ax.set_theta_direction(-1) # 逆时针方向绘图 plt.title('风玫瑰图示意图') plt.legend(loc=4, bbox_to_anchor=(1.15, -0.07)) # 将label显示出来, 并调整位置 plt.show()这样基本满足我们的需求了,但是有的时候我们需要绘制百分比玫瑰图,下面我们讨论如何制作百分比风玫瑰图:
数据转化成功,我们绘制图片唯一要修改的就是yaxis(本质是bar图,我们仔细观察上面的图不难发现原因)刻度的表达,将其转化为百分比:
N = 16 # 风速分布为16个方向 theta = np.linspace(0, 2*np.pi, N, endpoint=False) # 获取16个方向的角度值 width = np.pi / N # 绘制扇型的宽度,可以自行调整 labels = list(data.columns) # 自定义坐标标签为 N , NSN, …… # 开始绘图 plt.figure(figsize=(8,8)) ax = plt.subplot(111, projection='polar') for idx in data.index: # 每一行绘制一个扇形 radii = data.loc[idx] # 每一行数据 ax.bar(theta, radii, width=width, bottom=0.0, label=idx, tick_label=labels) #------------------------------------# ax.set_theta_zero_location('N') #设置零度方向北 ax.set_theta_direction(-1) # 逆时针方向绘图 #--------自定义yaxis的刻度格式-----------# plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda s, position: '{:.0f}%'.format(100*s))) plt.title('风玫瑰图示意图') plt.legend(loc=4, bbox_to_anchor=(1.15, -0.07)) # 将label显示出来, 并调整位置 plt.show()