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

如何将Matplotlib子图内容直接复制到inset_axes实现局部放大

如何在Matplotlib嵌入轴中复制原轴的绘图元素(无需重复绘图)

我需要实现一个函数,在原子图的特定区域创建放大的嵌入小框,使用inset_axes但不想重复绘制原轴的内容,希望直接复制原轴中的Line2D、Polygon和PathCollection元素。

解决方案代码

from matplotlib import pyplot as plt
from typing import Iterable
from matplotlib.lines import Line2D
from matplotlib.patches import Polygon
from matplotlib.collections import PathCollection


ax = plt.subplot()

# 原轴绘图
ax.plot((0, 1), (0, 1), label='line')
ax.fill(((0, 0), (1, 1), (2, 0)), color='orange', alpha=0.5, label='fill')
ax.scatter((1,), (1,), s=100, color='red', label='scatter')


def copy_artists(src_ax: plt.Axes, dst_ax: plt.Axes):
    """复制原轴中的Line2D、Polygon、PathCollection元素到目标轴"""
    for artist in src_ax.get_children():
        # 处理plot绘制的线条(Line2D)
        if isinstance(artist, Line2D):
            dst_ax.plot(artist.get_xdata(), artist.get_ydata(),
                        **artist.get_properties())
        # 处理fill绘制的填充区域(Polygon)
        elif isinstance(artist, Polygon):
            dst_ax.fill(artist.get_xy(), **artist.get_properties())
        # 处理scatter绘制的散点(PathCollection)
        elif isinstance(artist, PathCollection):
            offsets = artist.get_offsets()
            dst_ax.scatter(offsets[:, 0], offsets[:, 1],
                          s=artist.get_sizes(),
                          c=artist.get_facecolors(),
                          marker=artist.get_paths()[0],
                          **artist.get_properties())


def zoom_box(
    ax: plt.Axes,
    position: Iterable[Iterable[float]] = ((.6, .6), (.9, .9)),
    xlim: Iterable[float] = (None, None),
    ylim: Iterable[float] = (None, None)
) -> plt.Axes:

    (x0, y0), (x1, y1) = position
    axins = ax.inset_axes(
        [x0, y0, x1-x0, y1-y0],
        xlim=xlim,
        ylim=ylim
    )

    # 替换手动绘图逻辑,调用复制函数
    copy_artists(ax, axins)

    # 可选:添加原轴上的放大区域指示框和连线
    ax.indicate_inset_zoom(axins, edgecolor='black')

    return axins


axins = zoom_box(ax, xlim=(0.5, 1.5), ylim=(0.5, 1.5))
ax.legend()
plt.show()

方案说明

  1. 核心复制逻辑
    copy_artists函数遍历原轴的所有绘图元素,针对需要的三种类型做针对性复制:

    • 线条(Line2D):原样复制坐标数据和样式属性,保证和原轴线条一致
    • 填充区域(Polygon):复制填充顶点和填充样式,保留原有的颜色、透明度等
    • 散点(PathCollection):复制散点的位置、大小、颜色、标记形状等所有属性,完全复用原散点的样式
  2. 自动区域裁剪
    嵌入轴设置的xlim和ylim会自动过滤掉指定区域外的内容,不需要额外做坐标转换,直接就能显示放大后的效果。

  3. 可选增强
    调用ax.indicate_inset_zoom可以在原轴上画出放大区域的边框和连线,让图形的逻辑更清晰,读者一眼就能看出放大的是哪块区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 10:32:25