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

如何在Matplotlib中创建包含Rectangle与Text的自定义Patch类?

实现包含文本的自定义矩形Patch类

可以轻松实现,核心思路是继承Rectangle并将Text作为子Artist绑定到实例上,matplotlib会自动处理子Artist的渲染,无需手动调用add_patch/add_text。具体步骤如下:

实现思路

  1. 继承matplotlib.patches.Rectangle,直接复用其所有底层绘制逻辑
  2. 在初始化方法中创建Text实例,将其添加为当前Patch的子Artist
  3. 绑定Text的位置到矩形的特定坐标(比如中心),确保位置随矩形同步变化
  4. 可选重写位置/尺寸修改方法,保证文本位置随矩形属性更新而同步调整

完整代码示例

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib.text import Text

class MyRectangleText(Rectangle):
    def __init__(self, xy, width, height, text='', text_kwargs=None, **kwargs):
        # 初始化父类Rectangle,复用所有基础参数
        super().__init__(xy, width, height, **kwargs)
        
        # 处理文本样式参数,设置默认值
        text_kwargs = text_kwargs or {}
        default_text_style = {'ha': 'center', 'va': 'center', 'fontsize': 12}
        default_text_style.update(text_kwargs)
        
        # 计算矩形中心作为文本初始位置
        center_x = xy[0] + width/2
        center_y = xy[1] + height/2
        
        # 创建Text实例,自动继承父Patch的坐标变换
        self.text = Text(center_x, center_y, text, **default_text_style)
        # 将Text绑定为当前Patch的子Artist,matplotlib会自动渲染它
        self.add_child(self.text)
    
    # 重写set_xy方法,保证矩形移动时文本位置同步更新
    def set_xy(self, xy):
        super().set_xy(xy)
        # 重新计算中心位置并更新文本坐标
        center_x = xy[0] + self.get_width()/2
        center_y = xy[1] + self.get_height()/2
        self.text.set_position((center_x, center_y))
    
    # 可选:重写宽高修改方法,保证文本位置随尺寸变化同步更新
    def set_width(self, width):
        super().set_width(width)
        center_x = self.get_xy()[0] + width/2
        self.text.set_x(center_x)
    
    def set_height(self, height):
        super().set_height(height)
        center_y = self.get_xy()[1] + height/2
        self.text.set_y(center_y)

# 测试使用
fig, ax = plt.subplots()
# 创建自定义Patch实例,直接用ax.add_patch添加,和原生Rectangle用法一致
rect_text = MyRectangleText(
    (0.2, 0.3), 0.4, 0.3, 
    text='Hello', 
    facecolor='lightblue', edgecolor='blue',
    text_kwargs={'color': 'red', 'fontweight': 'bold'}
)
ax.add_patch(rect_text)

# 测试修改矩形属性,文本会同步更新
rect_text.set_xy((0.5, 0.5))
rect_text.set_width(0.5)

ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
plt.show()

关键细节说明

  • 子Artist绑定:通过self.add_child(self.text)将Text关联到Patch实例,matplotlib在渲染Patch时会自动遍历并渲染所有子Artist
  • 坐标同步:Text默认继承父Patch的坐标变换,无需额外配置,位置会和矩形保持同一坐标系统
  • 属性联动:重写set_xy/set_width等方法,是为了保证矩形属性修改时,文本位置能实时同步调整
  • 参数复用:父类Rectangle的所有样式参数(如facecolor、edgecolor)都能直接使用,同时通过text_kwargs单独自定义文本样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:26:11