Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Subplot of Windrose in matplotlib

I am trying to make a figure with 4 subplots of windrose, But I realised that the windrose only have axis like this:ax = WindroseAxes.from_ax() So, how can I draw a subplots with windrose?

like image 739
Owen Avatar asked Mar 11 '17 08:03

Owen


People also ask

What does subplots () do in Matplotlib?

Subplots mean groups of axes that can exist in a single matplotlib figure. subplots() function in the matplotlib library, helps in creating multiple layouts of subplots. It provides control over all the individual plots that are created.

How do I make subplots different sizes Matplotlib?

To change the size of subplots in Matplotlib, use the plt. subplots() method with the figsize parameter (e.g., figsize=(8,6) ) to specify one size for all subplots — unit in inches — and the gridspec_kw parameter (e.g., gridspec_kw={'width_ratios': [2, 1]} ) to specify individual sizes.


1 Answers

There are two solutions:

(a) creating axes from rectangles

First of all there is a similar question already here: How to add specific axes to matplotlib subplot?

There, the solution is to create a rectangle rect with coordinates of the new subplot axes within the figure and then call ax = WindroseAxes(fig, rect)

An easier to understand example would be

from windrose import WindroseAxes
from matplotlib import pyplot as plt
import numpy as np
ws = np.random.random(500) * 6
wd = np.random.random(500) * 360

fig=plt.figure()
rect=[0.5,0.5,0.4,0.4] 
wa=WindroseAxes(fig, rect)
fig.add_axes(wa)
wa.bar(wd, ws, normed=True, opening=0.8, edgecolor='white')

plt.show()

(b) adding a projection

Now it may be rather annoying to create this rectangle and it would be much better to be able to use the matplotlib subplot functionality.
One suggestion that has been made here is to register the WindroseAxes as a projection into matplotlib. To this end, you need to edit the file windrose.py in the site-packages/windrose as follows:

  1. Include an import from matplotlib.projections import register_projection at the beginning of the file.
  2. Then add a name variable :

    class WindroseAxes(PolarAxes):
        name = 'windrose'
        ...
    
  3. Finally, at the end of windrose.py, you add:

    register_projection(WindroseAxes)
    

Once that is done, you can easily create your windrose axes using the projection argument to the matplotlib axes:

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

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

fig = plt.figure()
ax = fig.add_subplot(221, projection="windrose")

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

ax.legend(bbox_to_anchor=(1.02, 0))
plt.show()
like image 188
ImportanceOfBeingErnest Avatar answered Sep 21 '22 01:09

ImportanceOfBeingErnest