matplotlib中风向玫瑰图的子图

8

我正在尝试制作包含4个风向玫瑰图的子图,但我发现风向玫瑰图仅有如下轴:ax = WindroseAxes.from_ax()。那么,我该如何绘制包含风向玫瑰图的子图呢?

3个回答

11

有两种解决方案:

(a) 从矩形创建坐标轴

首先,已经有一个类似的问题在这里:如何向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()

(b)添加投影

现在创建这个矩形可能会有些麻烦,最好能够使用matplotlib子图功能。
已经提出的一个建议在这里是将WindroseAxes注册为matplotlib的投影。为此,您需要编辑site-packages/windrose中的windrose.py文件,如下所示:

  1. 在文件开头包含一个导入from matplotlib.projections import register_projection
  2. 然后添加一个名称变量:

    class WindroseAxes(PolarAxes):
        name = 'windrose'
        ...
    
  3. 最后,在 windrose.py 的末尾添加:

  4. register_projection(WindroseAxes)
    

完成此步骤后,您可以使用 matplotlib 轴的 projection 参数轻松创建风向玫瑰图:

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

1
受到已接受的答案(由ImportanceOfBeingErnest提供)的启发,我使用以下内容将风向玫瑰图添加到现有的子图实例中:
import matplotlib as plt
from windrose import WindroseAxes  
 
fig, axes = plt.subplots(1,2)
rect=axes[0,1].get_position()
wax=WindroseAxes(fig, rect)
wax.bar(wd, ws)
axes[0,1].axis('off')

1

要使子图处于相同的比例尺上(例如针对月度数据),只需在add_subplot函数中添加rmax参数即可。 对我来说有效的做法是:

ax = fig.add_subplot(nrows, ncols, month, projection="windrose", rmax = 50)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接