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:
- Include an import
from matplotlib.projections import register_projection
at the beginning of the file.
Then add a name variable :
class WindroseAxes(PolarAxes):
name = 'windrose'
...
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()
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…