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
相关产品推荐
相关产品推荐

