因为监测数据中风速风向分析的需求,经常需要绘制风玫瑰图、趋势图等。在开始做这项工作的时候,在Excel中绘图,但是真实太无聊了,浪费时间,而且本人审美水平极差,绘制效果自然你懂的。
刚好以前因为ArcGIS自动化处理的需求,学过一阵子Python,又因为这些图像的绘制大多是程式化的东西,自动实现起来难度较低,且风格可以高度一致。
有一列风向及对应同时刻的风速数据即可使用Python绘制好看的风玫瑰图了。
除了matplotlib模块还需要windrose模块,可在CMD中通过如下命令安装:
pip install windrose
如果需要从Excel中获取数据还需要xlrd模块:
pip install xlrd
数据从Excel文件中获取,代码中使用的数据格式如下图:
以下是我在绘制简单风玫瑰图过程中使用的代码
import xlrd
import matplotlib as mpl
from matplotlib import pyplot as plt
from windrose import WindroseAxes
import matplotlib.cm as cm
mpl.rcParams['font.sans-serif'] = ['SimHei']
def new_axes():
fig = plt.figure(figsize=(4, 4), dpi=80, facecolor='w', edgecolor='w')
rect = [0, 0, 1, 1]
ax = WindroseAxes(fig, rect, axisbg='w')
fig.add_axes(ax)
return ax
#...and adjust the legend box
def set_legend(ax):
l = ax.legend(shadow=False, bbox_to_anchor=[1, 0])
plt.setp(l.get_texts(), fontsize=12)
for sn in range(2): #2个sheet中都有数据,一次绘制多个风玫瑰图
workspace=(r"……工作空间")
mybook=xlrd.open_workbook(workspace+r'……文件名')#打开文件
mysheet=mybook.sheet_by_index(sn)
rows=mysheet.nrows
ws=mysheet.col_values(5) #风速
wd=mysheet.col_values(6) #风向
ws.pop(0)
ws.pop(0)
wd.pop(0)
wd.pop(0)
sl=[0,0.2,1.5,3.3,5.4,7.9] #风速重分类间断点
ax = new_axes()
ax.contourf(wd,ws,bins=sl,normed=True,cmap=cm.cool) #使用matplotlib内置colormap进行色彩分割
ax.set_title(mysheet.name,fontsize=15,loc='right')
set_legend(ax)
plt.show()
绘制结果如下: