使用windrose轴控制多个子图的图例

时间:2018-03-22 05:08:26

标签: python matplotlib legend axes

我无法弄清楚如何让传说与子图中的数字(见下图)不重叠。问题是我的轴很复杂,因为它们来自windrose。获得轴:

1)我从Performance of foreach and forloop

下载了windrose.py.

2)我用我的python脚本example.py

将windrose.py复制到同一路径中

3)根据https://github.com/akrherz/windrose/tree/darylchanges的步骤,我改变了windrose.py,以便能够进行子图。这些步骤是将WindroseAxes作为matplotlib的投影。我编辑了windrose.py文件:

3a)包括

import from matplotlib.projections import register_projection 

在文件的开头。

3b)然后添加名称变量:

class WindroseAxes(PolarAxes):
    name = 'windrose'
    ...

3c)最后,在windrose.py结束时,添加:

register_projection(WindroseAxes)

完成后,您可以使用matplotlib轴的投影参数轻松创建windrose轴。

4)现在我在下面运行我的脚本(我的真实脚本的例子)

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

wind_speeds1 = np.array([12,10,13,15])
wind_dirs1 = np.array([60,76,32,80]) # in degrees

wind_speeds2 = np.array([23,12,10,8])
wind_dirs2 = np.array([23,45,29,13])

fig = plt.figure()
ax1 = fig.add_subplot(231,projection='windrose')
ax1.bar(wind_dirs1,wind_speeds1,normed=True,opening=0.8,edgecolor='white')
ax2 = fig.add_subplot(232,projection='windrose')
ax2.bar(wind_dirs2,wind_speeds2,normed=True,opening=0.8,edgecolor='white')

ax1.legend()
ax2.legend()
plt.tight_layout()
plt.show()

理想情况下,我想创建一个带有所有子图的最大/最小值的图例,因为它们都是相同的单位。此图例必须是子图上相同值的每个子图的相应颜色(例如,与所有子图相关的单个法线图例)。真实脚本中将有6个子图,但现在这里有2个显示了这一点。

Subplot of Windrose in matplotlib

1 个答案:

答案 0 :(得分:0)

这很容易解决。要仅绘制一个图例,请注释或删除绘制第一个图例的位置。要将图例移出绘图,请使用带有某个逻辑位置的bbox_to_anchor =()。请参阅下文,了解适用于此示例的示例。

import numpy as np
import matplotlib.pyplot as plt
from windrose_subplot import WindroseAxes

wind_speeds1 = np.array([12,10,13,15])
wind_dirs1 = np.array([60,76,32,80]) # in degrees

wind_speeds2 = np.array([23,12,10,8])
wind_dirs2 = np.array([23,45,29,13])

fig = plt.figure()
ax1 = fig.add_subplot(231,projection='windrose')
ax1.bar(wind_dirs1,wind_speeds1,normed=True,opening=0.8,edgecolor='white')
ax2 = fig.add_subplot(232,projection='windrose')
ax2.bar(wind_dirs2,wind_speeds2,normed=True,opening=0.8,edgecolor='white')

# ax1.legend()
ax2.legend(bbox_to_anchor=(1.2 , -0.1))
plt.tight_layout()
plt.show()

See this plot

但是,请注意bbox_to_anchor依赖于图例来自的轴,所以

ax1.legend(bbox_to_anchor=1.2, -0.1))
#ax2.legend()

会在第二个轴下方显示图例:

Like in this worse plot