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

Matplotlib Artist中clip_box的含义及代码失效问题咨询

Matplotlib clip_box 导致子图无显示的问题解决

你遇到的问题核心是clip_box 使用的是显示坐标系(display coordinates),而非你预期的轴数据坐标系。你创建的Bbox(np.array([[0, 0], [3, 9]]))对应的是显示空间里的像素坐标,这个区域极小(仅3x9像素),你的线条完全处于该区域之外,因此第二个子图看起来是空的。

要实现“截断线条末尾”的预期效果,需要把数据坐标系的边界转换为显示坐标系,或者直接基于轴的坐标系设置裁剪范围。以下是修正后的代码:

import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox
import numpy as np

fig = plt.figure()
ax = fig.subplots(1, 2)

x = [1, 2, 3, 4]
y = [3, 8, 5, 2]

line_a, = ax[0].plot(x, y, color='red', linewidth=3.0)
line_b, = ax[1].plot(x, y, color='red', linewidth=3.0)

# 将数据坐标系的Bbox转换为显示坐标系
data_bbox = Bbox(np.array([[0, 0], [3, 9]]))
# 利用轴的transData转换为显示空间的Bbox
display_bbox = ax[1].transData.transform_bbox(data_bbox)
line_b.set_clip_box(display_bbox)
line_b.set_clip_on(True)

plt.show()

也可以用更直观的方式,通过set_clip_path结合轴归一化坐标系定义裁剪范围:

# 用轴的归一化坐标系(0-1对应轴左下角到右上角)定义裁剪区域
from matplotlib.patches import Rectangle
clip_rect = Rectangle((0, 0), 0.75, 1, transform=ax[1].transAxes)
line_b.set_clip_path(clip_rect)

关键总结

  • clip_box的Bbox默认基于显示坐标系(像素级),不是数据坐标系
  • 要基于数据/轴坐标系设置裁剪,必须通过对应transform(如transData、transAxes)转换为显示空间坐标
  • 使用set_clip_path结合带transform的图形元素,是更直观的裁剪范围定义方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:20:19