Самый простой подход - установить прямоугольник клипа, который скрывает все, что находится за пределами прямоугольника. Поскольку у вас уже есть прямоугольник, его можно использовать для обрезания.
Поскольку граница рисуется по центру линии границы, половина ее будет обрезана. Это можно решить, установив ширину, чтобы удвоить желаемую ширину.
Обратите внимание, что для того, чтобы усечение работало должным образом, прямоугольник уже необходимо преобразовать в координаты осей. Итак, сначала добавьте прямоугольный патч к топору, и только затем используйте is, чтобы установить отсечение.
Также обратите внимание, что с параметрами по умолчанию прямоугольник использует один и тот же цвет для внутренней и тонкой границ. Установка нулевой ширины линии гарантирует, что она не будет рисоваться за пределами прямоугольника.
Аналогично, эллипсы могут быть нарисованы с линией только внутри.
В приведенном ниже коде используется толщина 10 и некоторые дополнительные пунктирные красные линии, чтобы проиллюстрировать происходящее.
import matplotlib.pyplot as plt
import matplotlib.patches as patches
fig, ax = plt.subplots()
pad = 0.1 # distance between the rectangles
for i in range(3):
for j in range(2):
x = .5 + i * (1 + pad)
y = .5 + j * (1 + pad)
if i == j:
patch = patches.Rectangle((x, y), 1, 1, facecolor='blue', linewidth=0)
elif i < 2:
patch = patches.Rectangle((x, y), 1, 1, facecolor='none', edgecolor='black',
linewidth=10*2 if j == 0 else 10)
else:
patch = patches.Ellipse((x+0.5, y+0.5), 1, 1, facecolor='none', edgecolor='black',
linewidth=10*2 if j == 0 else 10)
ax.add_patch(patch)
if j == 0:
patch.set_clip_path(patch)
for i in range(3):
x = .5 + i * (1 + pad)
for s in 0,1:
ax.axvline (x+s, color='crimson', ls=':', lw=1)
for j in range(2):
y = .5 + j * (1 + pad)
for s in 0,1:
ax.axhline (y+s, color='crimson', ls=':', lw=1)
ax.set_xlim([0, 4.0])
ax.set_ylim([0, 3.0])
ax.set_aspect('equal')
plt.show()
На рисунке ниже показан стандартный способ рисования вверху и обрезка с двойной шириной линии внизу.