2013-03-31 2 views
4

Это кажется довольно простой проблемой, но я новичок в Python, и я изо всех сил пытаюсь ее решить. У меня есть диаграмма рассеяния/тепловая карта, созданная из двух массивов numpy (около 25 000 единиц информации). Ось y берется непосредственно из массива, а ось x генерируется из простой операции вычитания на двух массивах.Нумерация массива с использованием многоугольника в Matplotlib

Теперь мне нужно сделать снимок данных, чтобы я мог работать с выбором, который попадает под определенные параметры на графике. Например, мне нужно, чтобы извлечь все точки, которые находятся в пределах параллелограмма: enter image description here

Я могу вырезать прямоугольник с помощью простых неравенств (см Индексирования 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, тем меньше жаргон у объяснение тем более вероятно, я буду в состоянии реализовать его , Спасибо за любую помощь, которую вы можете предоставить.

+0

не отвечает на вопрос, но ваши строки: 'МАГ = список ([twomass [ 'т']]); mag = np.array (mag) 'можно комбинировать:' mag = np.array ([twomass ['m']]) 'без промежуточного« списка », который был бы медленнее и терял память. Кроме того, 'jmag - hmag' уже будет массивом, поэтому не нужно вызывать' np.array (jmag - hmag) '. – askewchan

+0

в качестве побочного примечания, если вы беспокоитесь о том, что вещи являются массивами 'np.asarray', это приятно. – tacaswell

ответ

2
a = np.random.randint(0,10,(100,100)) 

x = np.linspace(-1,5.5,100) # tried to mimic your data boundaries 
y = np.linspace(8,16,100) 
xx, yy = np.meshgrid(x,y) 

m = np.all([yy > xx**2, yy < 10* xx, xx < 4, yy > 9], axis = 0) 

enter image description here

+0

Спасибо за ввод. Сможете ли вы объяснить, что происходит с линиями meshgrid и np.logical_and? Это похоже на элегантное решение, но я не могу разобраться, как это сделать в моем коде. Быстрая попытка дала ValueError: «Общий размер нового массива должен быть неизменным». Массивы, с которыми я работаю, являются единственными значениями ... они не являются матрицами. Если это имеет смысл. – Teachey

+0

Вместо моих векторов 'x' и' y' используйте массивы 'h' и' h-j'. У вас не может быть только одного индекса для каждого вектора 'h', потому что срез в' h' зависит от того, какое значение в 'hj' вы смотрите, потому что оно не прямоугольное, поэтому вам нужно сделать 2d-матрицу после все. – askewchan