Предложенное выше решение НЕ работает, потому что оно предназначено для одиночного непересекающегося небольшого квадрата.Когда мы используем два перекрывающихся четырехугольника (небольшое изменение в вашем примере):
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 6))
xi, yi = np.array([(-0.2, -0.2), (-0.2, 0.2), (0.2, 0.2), (0.2, -0.2), (-0.2, -0.2)]).T
xo, yo = np.array([(-1, 1.), (-1, -1.), (1, -1.), (1., 1.), (-1, 1.)]).T
plt.fill(list(xo)+list(xi)+list(xi+0.1), list(yo)+list(yi)+list(yi+0.1), facecolor='green', zorder=5)
plt.fill(list(xo+.3)+list(xi+.3), list(yo+.3)+list(yi+.3), facecolor='red', zorder=4)
plt.show()
Результаты такие, как показано в этом снимке
Кроме того, даже в вашем примере содин неперекрывающийся маленький квадрат, если этот квадрат не полностью «внутри» большего многоугольника, существует проблема рендеринга, как показано ниже:
mport numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 6))
xi, yi = np.array([(-0.2, -0.2), (-0.2, 0.2), (0.2, 0.2), (0.2, -0.2), (-0.2, -0.2)]).T
#xo, yo = np.array([(-1, 1.), (-1, -1.), (1, -1.), (1., 1.), (-1, 1.)]).T
xo, yo = np.array([(-.1, .1), (-1, -1.), (1, -1.), (1., 1.), (-.1, .1)]).T
#plt.fill(list(xo)+list(xi)+list(xi+0.1), list(yo)+list(yi)+list(yi+0.1), facecolor='green', zorder=5)
plt.fill(list(xo)+list(xi), list(yo)+list(yi), facecolor='green', zorder=5)
plt.fill(list(xo+.3)+list(xi+.3), list(yo+.3)+list(yi+.3), facecolor='red', zorder=4)
plt.show()
Это результат: Плохой рендеринг, когдамаленький квадрат частично снаружи
Возможно, с помощью Shapely union вы можете решить первую проблему с перекрытием маленьких квадратов, но как мы собираемся решить проблему с частично квадратами снаружи?Пожалуйста, дайте мне знать, что лучше для этого случая.