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

3 投票
1 回答
4075 浏览
提问于 2025-04-17 05:32

我想找一种方法,把散点图(X对Y,颜色由Z来决定)转换成一个二维的“像素”图像。也就是说,我想知道怎么绘制一个像素化的图像,其中每个像素的颜色是根据第三个变量来决定的。

在我的例子中,我有一份星系的列表,每个星系都有一个天空坐标(X,Y)和一个距离(Z)。我想制作一个X对Y的像素化图像,像素的颜色是根据Z来决定的(比如说,那个像素中星系的Z值的中位数)。

我知道可以用hexbin来做类似的事情,但我想要的是方形的像素,而不是六边形的。(更像是imshow生成的那种)。

我还在学习python,所以如果有简单快捷的方法来实现这个(或者有清晰的步骤教我怎么用复杂的方法来做!)那就太好了。

任何帮助都非常感谢!

1 个回答

2

好的,这里有两种方法可以实现这个目标。第一种方法是为距离设置几个明确的区间,比如说小于10pc、10pc到20pc之间和大于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都是一维数组,分别存储对应的坐标。接着,你需要创建一个二维数组来存储距离。然后,计算这些距离的中位数或平均值,接着用这个值去归一化你的二维数组。最后,使用等高线图来绘制结果(可以用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()

撰写回答