You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多windrose子图图例控制:解决图例与图形重叠问题

解决多子图场景下Windrose图例与图形重叠的问题

我之前也碰到过这个多子图里风玫瑰图(windrose)图例和图形重叠的麻烦,结合你用的这个修改版windrose库,给你几个实用的解决方案:

方法1:手动指定图例位置到子图外部

在绘制每个子图的windrose时,通过调整图例的bbox_to_anchor参数把图例移到子图外面,同时调整整个画布的布局留出空间。示例代码如下:

import matplotlib.pyplot as plt
from windrose import WindroseAxes

# 创建2x2的子图布局
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
axes = axes.flatten()

# 假设你有四组风速风向数据data_list
for i, data in enumerate(data_list):
    ax = WindroseAxes.from_ax(ax=axes[i])
    ax.bar(data['direction'], data['speed'], normed=True, opening=0.8)
    
    # 获取图例并调整位置到子图右侧外部
    legend = ax.legend()
    legend.set_bbox_to_anchor((1.02, 1))  # (x, y)坐标,可根据布局需求微调
    
# 调整子图间距,给右侧图例留出足够空间
plt.subplots_adjust(right=0.8, wspace=0.3)
plt.show()

方法2:修改windrose.py源码优化图例默认位置

既然你已经修改过windrose.py来支持子图,可以直接在源码里调整图例的默认设置,避免每次绘图都手动调整:

  1. 打开windrose.py,找到WindroseAxes类里的bar方法(或其他绘制图例的相关方法)
  2. 定位到创建图例的代码行,类似self.legend(...)的部分
  3. 修改图例参数,添加外部定位的配置,示例:
# 原代码可能为:
self.legend(title=self._info['bins'], loc='upper right')
# 修改为:
self.legend(title=self._info['bins'], loc='upper left', bbox_to_anchor=(1.05, 1))
  1. 保存修改后重启Python环境,后续绘制windrose子图时,图例默认就会放在子图右侧外部

方法3:用GridSpec精细控制子图布局

如果是大量子图,可以用matplotlib的GridSpec给图例单独分配空间,实现更规整的布局:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from windrose import WindroseAxes

# 创建GridSpec,右侧留出15%的空间专门放置图例
gs = GridSpec(2, 3, width_ratios=[4,4,1])
fig = plt.figure(figsize=(12, 8))

# 绘制子图
for i in range(4):
    row = i//2
    col = i%2
    ax = WindroseAxes.from_ax(ax=fig.add_subplot(gs[row, col]))
    ax.bar(data_list[i]['direction'], data_list[i]['speed'])
    
# 若所有子图图例内容一致,还可将图例统一放在右侧空白区域(可选)
plt.subplots_adjust(wspace=0.2)
plt.show()

这些方法都能有效解决图例重叠的问题,你可以根据子图数量和布局需求选择最适合的方案。

内容的提问来源于stack exchange,提问作者pwprnt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:15:12