天天看点

python用matplotlib画玫瑰_用Python matplotlib 怎么画风向玫瑰图 ,能给出程序的?

因为监测数据中风速风向分析的需求,经常需要绘制风玫瑰图、趋势图等。在开始做这项工作的时候,在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()

绘制结果如下: