Это кажется довольно простой проблемой, но я новичок в Python, и я изо всех сил пытаюсь ее решить. У меня есть диаграмма рассеяния/тепловая карта, созданная из двух массивов numpy (около 25 000 единиц информации). Ось y берется непосредственно из массива, а ось x генерируется из простой операции вычитания на двух массивах.Нумерация массива с использованием многоугольника в Matplotlib
Теперь мне нужно сделать снимок данных, чтобы я мог работать с выбором, который попадает под определенные параметры на графике. Например, мне нужно, чтобы извлечь все точки, которые находятся в пределах параллелограмма:
Я могу вырезать прямоугольник с помощью простых неравенств (см Индексирования idx_c
, idx_h
и idx
ниже), но я действительно нужен способ выбора точек с использованием более сложной геометрии. Похоже, что эту нарезку можно сделать, указав вершины многоугольника. Это примерно ближайший я могу найти решение, но я не могу понять, как его реализовать:
http://matplotlib.org/api/nxutils_api.html#matplotlib.nxutils.points_inside_poly
В идеале, мне действительно нужно что-то похожее на ниже индексации, то есть что-то вроде colorjh[idx]
. В конечном итоге мне придется строить разные количества (например, colorjh[idx]
против colorhk[idx]
), поэтому индексирование должно быть передано всем массивам в наборе данных (множество массивов). Возможно, это очевидно, но я бы предположил, что есть решения, которые могут быть не такими гибкими. Другими словами, я буду использовать этот сюжет для выбора интересующих меня точек, а затем мне понадобятся эти индексы для работы с другими массивами из одной таблицы.
Вот код, я работаю с:
import numpy as np
from numpy import ndarray
import matplotlib.pyplot as plt
import matplotlib
import atpy
from pylab import *
twomass = atpy.Table()
twomass.read('/IRSA_downloads/2MASS_GCbox1.tbl')
hmag = list([twomass['h_m']])
jmag = list([twomass['j_m']])
kmag = list([twomass['k_m']])
hmag = np.array(hmag)
jmag = np.array(jmag)
kmag = np.array(kmag)
colorjh = np.array(jmag - hmag)
colorhk = np.array(hmag - kmag)
idx_c = (colorjh > -1.01) & (colorjh < 6) #manipulate x-axis slicing here here
idx_h = (hmag > 0) & (hmag < 17.01) #manipulate y-axis slicing here
idx = idx_c & idx_h
# heatmap below
heatmap, xedges, yedges = np.histogram2d(hmag[idx], colorjh[idx], bins=200)
extent = [yedges[0], yedges[-1], xedges[-1], xedges[0]]
plt.clf()
plt.imshow(heatmap, extent=extent, aspect=0.65)
plt.xlabel('Color(J-H)', fontsize=15) #adjust axis labels here
plt.ylabel('Magnitude (H)', fontsize=15)
plt.gca().invert_yaxis() #I put this in to recover familiar axis orientation
plt.legend(loc=2)
plt.title('CMD for Galactic Center (2MASS)', fontsize=20)
plt.grid(True)
colorbar()
plt.show()
Как я уже сказал, я новичок в Python, тем меньше жаргон у объяснение тем более вероятно, я буду в состоянии реализовать его , Спасибо за любую помощь, которую вы можете предоставить.
не отвечает на вопрос, но ваши строки: 'МАГ = список ([twomass [ 'т']]); mag = np.array (mag) 'можно комбинировать:' mag = np.array ([twomass ['m']]) 'без промежуточного« списка », который был бы медленнее и терял память. Кроме того, 'jmag - hmag' уже будет массивом, поэтому не нужно вызывать' np.array (jmag - hmag) '. – askewchan
в качестве побочного примечания, если вы беспокоитесь о том, что вещи являются массивами 'np.asarray', это приятно. – tacaswell