matplotlib:如何将XYZ散射转换为像素图像?

时间:2011-11-02 23:14:33

标签: python image colors matplotlib scatter

我正在寻找某种方法将散点图(X对Y,由Z标准化的颜色)转换为2D“像素”图像。即如何绘制像素化图像,其中像素根据第三个变量着色?

就我而言,我有一个星系列表,每个星系都有一个天空坐标(X,Y)和一个距离(Z)。我想制作X与Y的像素化图像,像素颜色根据Z标准化(例如该像素中星系的中值Z值)。

我知道我可以用hexbin做这样的事情,但我希望有方形像素,而不是六边形。 (更像是imshow产生的东西)。

我还在学习python,所以如果有一个简单/快速的方法可以做到这一点(或者以复杂的方式明确说明如何做到这一点!)那就太好了。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

好的 - 有两种方法可以做到这一点。一个可能是你有一个谨慎的距离箱数(如d <10pc,10pc 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()

或者你可以做一个轮廓图,这样你就可以在x轴上规定RA,在y轴上规定Dec,并用距离填充图。 RA和Dec都是具有相应坐标的一维阵列。然后用距离制作一个2D数组。确定距离的中值/平均值是什么,然后将2D数组除以该值以对其进行标准化。最后,使用等高线图(使用contourf或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()