利用Python绘制多种风玫瑰图
目录
- 前言
- 导入模块
- 读取数据
- 计算风速的u、v分量
- uv风速散点图(含透明度)
- 风玫瑰图(多种形式)
- 绘制特定月份风玫瑰图
- 绘制风速频率直方图
- 在地图上绘制风玫瑰图
前言 风玫瑰是由气象学家用于给出如何风速和风向在特定位置通常分布的简明视图的图形工具。它也可以用来描述空气质量污染源。风玫瑰工具使用
Matplotlib
作为后端。安装方式直接使用:
pip install windrose
导入模块
import pandas as pdimport numpy as npfrom matplotlib import pyplot as pltimport matplotlib.cm as cmfrom math import piimport windrosefrom windrose import WindroseAxes, WindAxes, plot_windrosefrom mpl_toolkits.axes_grid1.inset_locator import inset_axesimport cartopy.crs as ccrsimport cartopy.io.img_tiles as cimgt
读取数据
df = pd.read_csv("./sample_wind_poitiers.csv", parse_dates=['Timestamp'])df = df.set_index('Timestamp')
计算风速的u、v分量
df['speed_x'] = df['speed'] * np.sin(df['direction'] * pi / 180.0)df['speed_y'] = df['speed'] * np.cos(df['direction'] * pi / 180.0)
uv风速散点图(含透明度)
fig, ax = plt.subplots(figsize=(8, 8), dpi=80)x0, x1 = ax.get_xlim()y0, y1 = ax.get_ylim()ax.set_aspect(abs(x1-x0)/abs(y1-y0))ax.set_aspect('equal')ax.scatter(df['speed_x'], df['speed_y'], alpha=0.25)df.plot(kind='scatter', x='speed_x', y='speed_y', alpha=0.05, ax=ax)Vw = 80ax.set_xlim([-Vw, Vw])ax.set_ylim([-Vw, Vw])
文章图片
风玫瑰图(多种形式)
ax = WindroseAxes.from_ax()ax.bar(df.direction.values, df.speed.values, bins=np.arange(0.01,10,1), cmap=cm.hot, lw=3)ax.set_legend()
【利用Python绘制多种风玫瑰图】
文章图片
ax = WindroseAxes.from_ax()ax.box(df.direction.values, df.speed.values, bins=np.arange(0.01,10,1), cmap=cm.hot, lw=3)ax.set_legend()
文章图片
plot_windrose(df, kind='contour', bins=np.arange(0.01,8,1), cmap=cm.hot, lw=3)
文章图片
绘制特定月份风玫瑰图
def plot_month(df, t_year_month, *args, **kwargs):by = 'year_month'df[by] = df.index.map(lambda dt: (dt.year, dt.month))df_month = df[df[by] == t_year_month]ax = plot_windrose(df_month, *args, **kwargs)return axplot_month(df, (2014, 7), kind='contour', bins=np.arange(0, 10, 1), cmap=cm.hot)
文章图片
plot_month(df, (2014, 8), kind='contour', bins=np.arange(0, 10, 1), cmap=cm.hot)
文章图片
plot_month(df, (2014, 9), kind='contour', bins=np.arange(0, 10, 1), cmap=cm.hot)
文章图片
绘制风速频率直方图
bins = np.arange(0,30+1,1)bins = bins[1:]plot_windrose(df, kind='pdf', bins=np.arange(0.01,30,1),normed=True)
在地图上绘制风玫瑰图
proj = ccrs.PlateCarree()fig = plt.figure(figsize=(12, 6))minlon, maxlon, minlat, maxlat = (6.5, 7.0, 45.85, 46.05)main_ax = fig.add_subplot(1, 1, 1, projection=proj)main_ax.set_extent([minlon, maxlon, minlat, maxlat], crs=proj)main_ax.gridlines(draw_labels=True)main_ax.add_wms(wms='http://vmap0.tiles.osgeo.org/wms/vmap0',layers=['basic'])cham_lon, cham_lat = (6.8599, 45.9259)passy_lon, passy_lat = (6.7, 45.9159)wrax_cham = inset_axes(main_ax,width=1,height=1,loc='center',bbox_to_anchor=(cham_lon, cham_lat),bbox_transform=main_ax.transData,axes_class=windrose.WindroseAxes,height_deg = 0.1wrax_passy = inset_axes(main_ax,width="100%",height="100%",bbox_to_anchor=(passy_lon-height_deg/2, passy_lat-height_deg/2, height_deg, height_deg),bbox_transform=main_ax.transData,axes_class=windrose.WindroseAxes,)wrax_cham.bar(df.direction.values, df.speed.values,bins=np.arange(0.01,10,1), lw=3)wrax_passy.bar(df.direction.values, df.speed.values,bins=np.arange(0.01,10,1), lw=3)for ax in [wrax_cham, wrax_passy]:ax.tick_params(labelleft=False, labelbottom=False)
文章图片
最后:
这样绘制出来的风玫瑰看起来还是很漂亮的,并且也能够大大提高工作效率,对于那些科研人员是很有帮助的。代码以及图片效果就放在上面了。
推荐阅读
- 使用Python绘制空气质量日历图
- 利用Python写了一个水果忍者小游戏
- 游戏|Python实现超级玛丽游戏系列教程02玛丽行走
- 一行 Python 代码,20款经典小游戏
- 游戏程序|python实现超级玛丽小游戏(动图演示+源码分享)
- 学习资源整合|熬夜整理了2021年Python最新学习资料,分享给学弟学妹们【大学生必备】
- 在安卓手机上利用IPV6地址创建全球可以直接访问的FTP服务器的步骤
- Python|python(基本介绍)
- python爬取豆瓣电影Top250(附完整源代码)
- Python|Python 教程(从 Python 爬虫到数据分析)