利用Python绘制多种风玫瑰图

作者:蚂蚁ailing 时间:2023-05-05 03:41:50 

前言

风玫瑰是由气象学家用于给出如何风速和风向在特定位置通常分布的简明视图的图形工具。它也可以用来描述空气质量污染源。风玫瑰工具使用Matplotlib作为后端。

安装方式直接使用:

pip install windrose

导入模块

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.cm as cm
from math import pi
import windrose
from windrose import WindroseAxes, WindAxes, plot_windrose
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import cartopy.crs as ccrs
import 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 = 80
ax.set_xlim([-Vw, Vw])
ax.set_ylim([-Vw, Vw])

利用Python绘制多种风玫瑰图

风玫瑰图(多种形式)

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()

利用Python绘制多种风玫瑰图

plot_windrose(df, kind='contour', bins=np.arange(0.01,8,1), cmap=cm.hot, lw=3)

利用Python绘制多种风玫瑰图

绘制特定月份风玫瑰图

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 ax
plot_month(df, (2014, 7), kind='contour', bins=np.arange(0, 10, 1), cmap=cm.hot)

利用Python绘制多种风玫瑰图

plot_month(df, (2014, 8), kind='contour', bins=np.arange(0, 10, 1), cmap=cm.hot)

利用Python绘制多种风玫瑰图

plot_month(df, (2014, 9), kind='contour', bins=np.arange(0, 10, 1), cmap=cm.hot)

利用Python绘制多种风玫瑰图

绘制风速频率直方图

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.1
wrax_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绘制多种风玫瑰图

最后:

这样绘制出来的风玫瑰看起来还是很漂亮的,并且也能够大大提高工作效率,对于那些科研人员是很有帮助的。代码以及图片效果就放在上面了。

来源:https://www.cnblogs.com/123456feng/p/16135257.html

标签:Python,绘制,风玫瑰,图
0
投稿

猜你喜欢

  • Golang并发读取文件数据并写入数据库的项目实践

    2024-01-29 07:22:50
  • PyQt5中QTimer定时器的实例代码

    2021-06-01 07:28:54
  • 微信公众平台实现获取用户OpenID的方法

    2023-11-17 05:55:56
  • MySQL中出现乱码问题的终极解决宝典

    2024-01-27 15:03:30
  • Mysql中如何查看执行计划

    2024-01-21 14:03:56
  • asp如何显示SQL数据库所有表的名称?

    2010-06-08 09:30:00
  • JavaScript二维数组实现的省市联动菜单

    2024-06-14 22:02:56
  • Python+uiautomator2实现手机锁屏解锁功能

    2021-05-26 23:04:12
  • Sql Server 无日志文件附加

    2010-05-30 11:23:00
  • javascript json字符串到json对象转义问题

    2023-07-02 05:18:22
  • Python使用htpasswd实现基本认证授权的例子

    2022-05-07 06:43:17
  • 浅述python2与python3的简单区别

    2022-03-06 21:19:47
  • ASP.NET Core中的Options选项模式

    2024-05-13 09:16:59
  • OpenCV图像缩放之cv.resize()函数详解

    2021-02-06 12:36:58
  • Python如何脚本过滤文件中的注释

    2021-10-03 15:24:52
  • Python字符串拼接六种方法介绍

    2021-07-30 01:34:14
  • Python字典推导式将cookie字符串转化为字典解析

    2023-02-26 14:22:17
  • Python requests用法和django后台处理详解

    2023-06-12 02:05:42
  • Python爬虫动态ip代理防止被封的方法

    2022-01-24 00:15:30
  • 在双python下设置python3为默认的方法

    2022-03-02 10:31:39
  • asp之家 网络编程 m.aspxhome.com