使用 windrose 轴控制多个子图的图例
Posted
技术标签:
【中文标题】使用 windrose 轴控制多个子图的图例【英文标题】:Controlling legend across multiple subplots with windrose axes 【发布时间】:2018-08-31 10:28:39 【问题描述】:我无法弄清楚如何使图例不与子图中的数字重叠(见下图)。问题是我的斧头很复杂,因为它们来自风玫瑰。获取坐标轴:
1) 我已经从https://github.com/akrherz/windrose/tree/darylchanges 下载了windrose.py
2) 我将 windrose.py 复制到与我的 python 脚本 example.py 相同的路径中
3) 根据Subplot of Windrose in matplotlib 中的步骤,我更改了 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 个子图显示了这一点。
【问题讨论】:
请参阅***.com/a/4701285,了解如何控制图例的去向。legend()
方法也接受 loc 参数,如果 ax.legend(loc='best')
在许多情况下做得很好。我不知道这是否对 winrose 有帮助
是的,我不能用 windrose 轴做到这一点
谁能解释我的问题被否决了?
【参考方案1】:
这很容易解决。为了只绘制一个图例,请注释掉或删除绘制第一个图例的位置。为了将图例移出绘图,请使用 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()
但是,请注意 bbox_to_anchor 依赖于图例来自的轴,所以
ax1.legend(bbox_to_anchor=1.2, -0.1))
#ax2.legend()
将在第二个轴下方显示图例:
【讨论】:
以上是关于使用 windrose 轴控制多个子图的图例的主要内容,如果未能解决你的问题,请参考以下文章
在带有子图的 geopandas 图中添加图例会改变图的大小
Python seaborn可视化:组合多个seaborn可视化结果并使得组合结果图像共享Y轴使用matplotlib的subplots子图函数的gridspec_kw参数指定子图的相对大小或者比率