Matplotlib: Как визуализировать только небольшую область большей фигуры (клип) - PullRequest
1 голос
/ 04 мая 2020

Я использую matplotlib, чтобы нарисовать контурный график. На втором шаге я хотел бы извлечь небольшую область из этого графика и нарисовать ее на новой оси.

Самым близким, что я мог найти, был учебник для обрезки изображения: https://matplotlib.org/3.1.0/gallery/images_contours_and_fields/image_clip_path.html

Но я не нашел способа вырезать патч из фигуры.

Вот код для создания контурного графика: (на основе этого примера: https://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html )

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-5, 5, 0.1)
y = np.arange(-5, 5, 0.1)
xx, yy = np.meshgrid(x, y, sparse=True)
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
h = plt.contourf(x,y,z)
plt.plot(-2, 2.5, 'or')
plt.show()

Прикрепленное изображение 1 показывает вид рисунка, который я хотел бы создать: новая фигура с такой же ограничительной рамкой, что и исходная фигура, но только нарисован небольшой участок вокруг известной позиции.

1 Ответ

0 голосов
/ 04 мая 2020

Значения NaN в z не отображаются. Следовательно, все, что вам нужно сделать, это определить путь клипа, а затем определить, какие значения (x, y) выходят за пределы этого пути, и установить соответствующие значения z равными NaN.

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-5, 5, 0.01) # need higher resolution to get nice clipping boundaries
y = np.arange(-5, 5, 0.01)
xx, yy = np.meshgrid(x, y) # need dense meshgrid for contains_points
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)

patch = plt.Circle((-2, 2), 1) # circle with radius 1 around the point (-2, 2)
path = patch.get_path().transformed(patch.get_patch_transform()) # the path attribute of Circle has to be transformed to data units
is_valid = path.contains_points(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
z[~is_valid] = np.nan # NaN values are not plotted

h = plt.contourf(xx,yy,z)

plt.plot(-2, 2.5, 'or')
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...