matplotlib: как я могу преобразовать разброс XYZ в пиксельное изображение?

Я ищу способ преобразовать точечную диаграмму (X против Y, цвет, нормализованный по Z) в 2D-изображение «пиксель». т.е. как я могу построить пикселизированное изображение, где пиксели окрашены в соответствии с третьей переменной?

В моем случае у меня есть список галактик, каждая из которых имеет координаты неба (X, Y) и расстояние (Z). Я хочу сделать пикселизированное изображение X и Y с нормализованным цветом пикселей в соответствии с Z (например, медианное значение Z для галактик в этом пикселе).

Я знаю, что мог бы сделать что-то подобное с hexbin, но я хотел бы иметь квадратные пиксели, а не шестиугольники. (Что-то больше похожее на то, что производит imshow).

Я все еще изучаю Python, поэтому, если есть простой/быстрый способ сделать это (или четкие инструкции о том, как сделать это сложным способом!), Это было бы здорово.

Любая помощь приветствуется!


person aim    schedule 02.11.2011    source источник
comment
Взгляните также на numpy.histogram2d с одинаковым количеством ячеек для каждого измерения, и вы получите то, что хотите, в одной строке.   -  person Florian M.    schedule 06.09.2016


Ответы (1)


Хорошо - есть два способа сделать это. Один из них заключается в том, чтобы у вас было дискретное количество ячеек для расстояний (например, d ‹ 10pc, 10pc ‹ d ‹ 20pc, d> 20pc). Это относительно просто, все, что вам нужно сделать, это несколько циклов — вот пример с 3:

raclose = []
ramid = []
rafar = []
decdlose = []
decmid = []
decfar = []

for ii in range(len(dist)):
  if dist[ii] < 10.:
    raclose.append(ra[ii])
    decclose.append(dec[ii])
  elif dist[ii] > 20.:
    rafar.append(ra[ii])
    decfar.append(dec[ii])
  else:
    ramid.append(ra[ii])
    decmid.append(dec[ii])

plt.clf
ax1 = scatter(raclose, decclose, marker='o', s=20, color="darkgreen", alpha=0.6)
ax2 = scatter(ramid, decmid, marker='o', s=20, color="goldenrod", alpha=0.6)
ax3 = scatter(rafar, decfar, marker='o', s=20, color="firebrick", alpha=0.6)
line1 = Line2D(range(10), range(10), marker='o', color="darkgreen")
line2 = Line2D(range(10), range(10), marker='o',color="goldenrod")
line3 = Line2D(range(10), range(10), marker='o',color="firebrick")
plt.legend((line1,line2,line3),('d < 10pc','20pc > d > 10pc', 'd > 20pc'),numpoints=1, loc=3)
show()

Или вы можете сделать контурный график, указав RA по оси X и Dec по оси Y и заполнив график расстояниями. И RA, и Dec представляют собой одномерные массивы с соответствующими координатами. Затем вы создаете двумерный массив с расстоянием. Определите медианное/среднее значение расстояний, а затем разделите двумерный массив на это значение, чтобы нормализовать его. Наконец, нарисуйте контурный график (используя контур или imshow), например:

import matplotlib.pyplot as plt
from matplotlib import cm
ax = pylab.contourf(RA,Dec,dists, levels=[1, 5, 10, 15], cmap=plt.cm.spectral)
cbar=pylab.colorbar()
person cosmosis    schedule 03.11.2011
comment
Спасибо за помощь - есть что-то похожее на ваше второе решение. Я создаю 2D-массив и ввожу его в imshow. Спасибо еще раз! - person aim; 05.11.2011
comment
О, хорошо! Я использую второе решение в ряде своих собственных подпрограмм, но понял, что оно немного сложнее, чем, возможно, вам хотелось бы. Рад, что у тебя получилось. - person cosmosis; 05.11.2011