Skip to main content

Python Matplotlib, Numpy library to manage wind data, draw windrose (also known as a polar rose plot)

Project description

Latest Version Supported Python versions Wheel format License Development Status Downloads monthly Code Health Build Status

windrose

A windrose, also known as a polar rose plot, is a special diagram for representing the distribution of meteorological datas, typically wind speeds by class and direction. This is a simple module for the matplotlib python library, which requires numpy for internal computation.

Original code forked from: - http://youarealegend.blogspot.fr/search/label/windrose

Requirements:

Notebook example :

An IPython (Jupyter) notebook showing this package usage is available at:

Script example :

This example use randoms values for wind speed and direction(ws and wd variables). In situation, these variables are loaded with reals values (1-D array), from a database or directly from a text file (see the “load” facility from the matplotlib.pylab interface for that).

from windrose import WindroseAxes
from matplotlib import pyplot as plt
import matplotlib.cm as cm
import numpy as np

#Create wind speed and direction variables

ws = np.random.random(500) * 6
wd = np.random.random(500) * 360

A stacked histogram with normed (displayed in percent) results :

ax = WindroseAxes.from_ax()
ax.bar(wd, ws, normed=True, opening=0.8, edgecolor='white')
ax.set_legend()
bar

bar

Another stacked histogram representation, not normed, with bins limits

ax = WindroseAxes.from_ax()
ax.box(wd, ws, bins=np.arange(0, 8, 1))
ax.set_legend()
box

box

A windrose in filled representation, with a controled colormap

ax = WindroseAxes.from_ax()
ax.contourf(wd, ws, bins=np.arange(0, 8, 1), cmap=cm.hot)
ax.set_legend()
contourf

contourf

Same as above, but with contours over each filled region…

ax = WindroseAxes.from_ax()
ax.contourf(wd, ws, bins=np.arange(0, 8, 1), cmap=cm.hot)
ax.contour(wd, ws, bins=np.arange(0, 8, 1), colors='black')
ax.set_legend()
contourf-contour

contourf-contour

…or without filled regions

ax = WindroseAxes.from_ax()
ax.contour(wd, ws, bins=np.arange(0, 8, 1), cmap=cm.hot, lw=3)
ax.set_legend()
contour

contour

After that, you can have a look at the computed values used to plot the windrose with the ax._info dictionnary : - ax._info['bins'] : list of bins (limits) used for wind speeds. If not set in the call, bins will be set to 6 parts between wind speed min and max. - ax._info['dir'] : list of directions “bundaries” used to compute the distribution by wind direction sector. This can be set by the nsector parameter (see below). - ax._info['table'] : the resulting table of the computation. It’s a 2D histogram, where each line represents a wind speed class, and each column represents a wind direction class.

So, to know the frequency of each wind direction, for all wind speeds, do:

ax.bar(wd, ws, normed=True, nsector=16)
table = ax._info['table']
wd_freq = np.sum(table, axis=0)

and to have a graphical representation of this result :

direction = ax._info['dir']
wd_freq = np.sum(table, axis=0)
plt.bar(np.arange(16), wd_freq, align='center')
xlabels = ('N','','N-E','','E','','S-E','','S','','S-O','','O','','N-O','')
xticks=arange(16)
gca().set_xticks(xticks)
draw()
gca().set_xticklabels(xlabels)
draw()
histo\_WD

histo_WD

In addition of all the standard pyplot parameters, you can pass special parameters to control the windrose production. For the stacked histogram windrose, calling help(ax.bar) will give : bar(self, direction, var, **kwargs) method of windrose.WindroseAxes instance Plot a windrose in bar mode. For each var bins and for each sector, a colored bar will be draw on the axes.

Mandatory: - direction : 1D array - directions the wind blows from, North centred - var : 1D array - values of the variable to compute. Typically the wind speeds

Optional: - nsector : integer - number of sectors used to compute the windrose table. If not set, nsectors=16, then each sector will be 360/16=22.5°, and the resulting computed table will be aligned with the cardinals points. - bins : 1D array or integer- number of bins, or a sequence of bins variable. If not set, bins=6 between min(var) and max(var). - blowto : bool. If True, the windrose will be pi rotated, to show where the wind blow to (usefull for pollutant rose). - colors : string or tuple - one string color ('k' or 'black'), in this case all bins will be plotted in this color; a tuple of matplotlib color args (string, float, rgb, etc), different levels will be plotted in different colors in the order specified. - cmap : a cm Colormap instance from matplotlib.cm. - if cmap == None and colors == None, a default Colormap is used. - edgecolor : string - The string color each edge bar will be plotted. Default : no edgecolor - opening : float - between 0.0 and 1.0, to control the space between each sector (1.0 for no space)

probability density function (pdf) and fitting Weibull distribution

A probability density function can be plot using:

from windrose import WindAxes
ax = WindAxes.from_ax()
bins = np.arange(0, 6 + 1, 0.5)
bins = bins[1:]
ax, params = ax.pdf(ws, bins=bins)
pdf

pdf

Optimal parameters of Weibull distribution can be displayed using

print(params)
(1, 1.7042156870194352, 0, 7.0907180300605459)

Functional API

Instead of using object oriented approach like previously shown, some “shortcut” functions have been defined: wrbox, wrbar, wrcontour, wrcontourf, wrpdf. See unit tests.

Pandas support

windrose not only supports Numpy arrays. It also supports also Pandas DataFrame. plot_windrose function provides most of plotting features previously shown.

N = 500
ws = np.random.random(N) * 6
wd = np.random.random(N) * 360
df = pd.DataFrame({'speed': ws, 'direction': wd})
plot_windrose(df, kind='contour', bins=np.arange(0.01,8,1), cmap=cm.hot, lw=3)

Mandatory: - df: Pandas DataFrame with DateTimeIndex as index and at least 2 columns ('speed' and 'direction').

Optional: - kind : kind of plot (might be either, 'contour', 'contourf', 'bar', 'box', 'pdf') - var_name : name of var column name ; default value is VAR_DEFAULT='speed' - direction_name : name of direction column name ; default value is DIR_DEFAULT='direction' - clean : cleanup data function (remove data points with NaN, var=0) before plotting ; default value is clean=clean_df. If clean=None no data cleanup if performed.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

windrose-1.5.tar.gz (13.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

windrose-1.5-py2.py3-none-any.whl (15.2 kB view details)

Uploaded Python 2Python 3

File details

Details for the file windrose-1.5.tar.gz.

File metadata

  • Download URL: windrose-1.5.tar.gz
  • Upload date:
  • Size: 13.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for windrose-1.5.tar.gz
Algorithm Hash digest
SHA256 956a9e79d887c16c4d3461bda658e05e98b5dff20e84d6b5774de76bfcc53cfd
MD5 b22c21b1215d95b85e6e3c6344cef160
BLAKE2b-256 f3930a1744f90f7ab86c50fbe9a6fefd01771dfbd6d24eabab295aa6b6f7f986

See more details on using hashes here.

File details

Details for the file windrose-1.5-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for windrose-1.5-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 751adb6ea2b9386e75d972fdb6e653578143db3fc97c34992644c32e2d2c1af2
MD5 d64fb07732b9fce0220f9c15b4f60fc7
BLAKE2b-256 97cfe47497ea62afd14d16c31c98f3e73309e9160b2c5439cd2eaae54342c9e7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page