我试图用windrose的4个子图制作一个图,但是我意识到windrose仅具有这样的轴:ax = WindroseAxes.from_ax()那么,我如何用windrose绘制一个子图?
有两种解决方案:
首先,这里已经存在一个类似的问题:如何将特定轴添加到matplotlib子图中?
在那里,解决方案是在图中创建一个rect具有新子图轴坐标的矩形,然后调用ax = WindroseAxes(fig, rect)
一个更容易理解的例子是
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()
Run Code Online (Sandbox Code Playgroud)
现在创建该矩形可能会很烦人,并且能够使用matplotlib子图功能会更好。这里
提出的一个建议是将其注册为对matplotlib的投影。为此,需要在site-packages / windrose中编辑文件windrose.py,如下所示:WindroseAxes
from matplotlib.projections import register_projection在文件的开头包括导入。然后添加一个名称变量:
class WindroseAxes(PolarAxes):
name = 'windrose'
...
Run Code Online (Sandbox Code Playgroud)最后,在windrose.py的末尾,添加:
register_projection(WindroseAxes)
Run Code Online (Sandbox Code Playgroud)完成此操作后,您可以使用matplotlib轴的projection参数轻松创建windrose轴:
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2786 次 |
| 最近记录: |