Функция для определения области на цветовой карте и возврата среднего значения в пикселях

#matplotlib #colormap #imshow

#matplotlib #цветовая карта #imshow

Вопрос:

У меня есть .txt данные с разделителями размером около 600 x 600 ячеек. Я построил график, используя matplotlib imshow , и теперь я хочу проанализировать конкретную часть, представляющую интерес в нем. В частности, меня интересует рисование определенной области вокруг определенной точки (x, y) и возврат среднего значения (из файла) в пределах этой области. Я провел некоторый поиск, но не могу найти ничего, что позволило бы мне манипулировать этим как таковым. Самое близкое, к чему я пришел, — это patches или patches.Circle функция, но все, что она делает, это позволяет мне нарисовать круг вокруг определенной точки. Я не могу извлечь (или не могу понять, как это сделать) оттуда какую-либо информацию. Вот мой рабочий пример:

 import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches

#Setup Plots
fig, ax = plt.subplots(figsize=(20, 10))
plt.rcParams.update({'font.size': 20})
#Open Data
filename = "smalltest.txt"
data = np.genfromtxt(filename, delimiter = ";", skip_header = 0)

#Colourmap
ax.imshow(data, cmap ='hot', interpolation='nearest')

#-------------------------------------
#Average values around point

#Create circle
circ = patches.Circle((345, 195), 60, alpha=0.8, fc='none', 
edgecolor = 'yellow')
ax.add_patch(circ)

fig.colorbar(ax.imshow(data, cmap ='hot', interpolation='nearest'), 
label = "Temperature (K)")
plt.show()
  

Вот изображение в качестве примера:
Создан график. Пытаюсь получить среднее значение внутри нарисованного круга

Комментарии:

1. Для рисования статического круга patches.Circle подойдет; чтобы позволить пользователю рисовать круг в интерактивном режиме, вы можете использовать EllipseSelector . Чтобы получить данные из массива, который находится в пределах диапазона координат, вы можете создать numpy.meshgrid набор координат и отфильтровать данные по условию для координат. например filtered_data = data[(x-x0)**2 (y-y0)**2 y <= r**2] . Чтобы вычислить среднее значение массива, use array.mean() .

2. @ImportanceOfBeingErnest похоже, numpy.meshgrid это то, что я искал. Большое вам спасибо!