创建二进制完整性映射

时间:2016-03-22 13:55:08

标签: python numpy matplotlib

我正在触及我的项目的目标,但我遇到了问题:如何创建完整性地图? 我有很多数据,一个可能有500.000个对象的字段,在我的图中用不同缩放的点表示:

Without zoom First zoom Second zoom

我想创建一个蒙版,我的意思是,用微小像素剪切我的绘图,并说如果我在这个像素中有一个对象,我得到的值:1(例如黑色)elif,我没有反对我的像素,我得到的值:0(例如白色)。

我将创建一个遮罩,我可以通过这个遮罩划分每个字段。 问题是我不知道如何处理才能做到:/

我创建了第一个脚本,以便对我的数据进行选择。这一个:

#!/usr/bin/python
# coding: utf-8

from astropy.io import fits
from astropy.table import Table
import numpy as np
import matplotlib.pyplot as plt

                ###################################
                # Fichier contenant le champ brut #
                ###################################

filename = '/home/valentin/Desktop/Field52_combined_final_roughcal.fits'

# Ouverture du fichier à l'aide d'astropy  
field = fits.open(filename)   
print "Ouverture du fichier : " + str(filename)       

# Lecture des données fits
tbdata = field[1].data   
print "Lecture des données du fits"            

                ###############################
                # Application du tri sur PROB #
                ###############################

mask = np.bitwise_and(tbdata['PROB'] < 1.1, tbdata['PROB'] > -0.1)  
new_tbdata = tbdata[mask]   
print "Création du Masque"       

            #################################################
            # Détermination des valeurs extremales du champ #
            #################################################

# Détermination de RA_max et RA_min 
RA_max = np.max(new_tbdata['RA'])
RA_min = np.min(new_tbdata['RA'])
print "RA_max vaut :     " + str(RA_max)
print "RA_min vaut :     " + str(RA_min)

# Détermination de DEC_max et DEC_min   
DEC_max = np.max(new_tbdata['DEC'])
DEC_min = np.min(new_tbdata['DEC'])
print "DEC_max vaut :   " + str(DEC_max)
print "DEC_min vaut :   " + str(DEC_min)

            #########################################
            # Calcul de la valeur centrale du champ #
            #########################################

# Détermination de RA_moyen et DEC_moyen
RA_central = (RA_max + RA_min)/2.
DEC_central = (DEC_max + DEC_min)/2.

print "RA_central vaut : " + str(RA_central)
print "DEC_central vaut : " + str(DEC_central)

print " "
print " ------------------------------- "
print " "

        ##############################
        # Détermination de X et de Y #
        ##############################


# Creation du tableau
new_col_data_X = array = (new_tbdata['RA'] - RA_central) * np.cos(DEC_central)
new_col_data_Y = array = new_tbdata['DEC'] - DEC_central
print 'Création du tableau'


# Creation des nouvelles colonnes
col_X = fits.Column(name='X', format='D', array=new_col_data_X)
col_Y = fits.Column(name='Y', format='D', array=new_col_data_Y)
print 'Création des nouvelles colonnes X et Y'


# Creation de la nouvelle table
tbdata_final = fits.BinTableHDU.from_columns(new_tbdata.columns + col_X + col_Y)

# Ecriture du fichier de sortie .fits
tbdata_final.writeto('{}_{}'.format(filename,'mask'))
print 'Ecriture du nouveau fichier mask'

field.close()

好的,它正在运作!但现在,第二部分就是现在:

###################################################
###################################################
###################################################

filename = '/home/valentin/Desktop/Field52_combined_final_roughcal.fits_mask'

print 'Fichier en cours de traitement' + str(filename) + '\n'

# Ouverture du fichier à l'aide d'astropy
field = fits.open(filename)         

# Lecture des données fits  
tbdata = field[1].data    

figure = plt.figure(1)
plt.plot (tbdata['X'], tbdata['Y'], '.')
plt.show()

你知道怎么过程吗? 我怎样才能在小垃圾箱里剪掉我的阴谋?

谢谢! 更新:

在armatita的回答之后,我更新了我的脚本:

###################################################
###################################################
###################################################

filename = '/home/valentin/Desktop/Field52_combined_final_roughcal.fits_mask'

print 'Fichier en cours de traitement' + str(filename) + '\n'

# Opening file with astropy
field = fits.open(filename)         

# fits data reading 
tbdata = field[1].data    

##### BUILDING A GRID FOR THE DATA ########
nodesx,nodesy = 360,360   # PIXELS IN X, PIXELS IN Y
firstx,firsty = np.min(tbdata['X']),np.min(tbdata['Y'])
sizex = (np.max(tbdata['X'])-np.min(tbdata['X']))/nodesx
sizey = (np.max(tbdata['Y'])-np.min(tbdata['Y']))/nodesy
grid = np.zeros((nodesx+1,nodesy+1),dtype='bool') # PLUS 1 TO ENSURE ALL DATA IS INSIDE GRID

# CALCULATING GRID COORDINATES OF DATA
indx = np.int_((tbdata['X']-firstx)/sizex)
indy = np.int_((tbdata['Y']-firsty)/sizey)
grid[indx,indy] = True  # WHERE DATA EXISTS SET TRUE

# PLOT MY FINAL IMAGE
plt.imshow(grid.T,origin='lower',cmap='binary',interpolation='nearest')
plt.show()

我发现这个情节:

solution

所以,当我使用bin大小时,我可以看到或多或少的空白,表示我的像素中是否有对象:)

1 个答案:

答案 0 :(得分:1)

这通常是将数据插入网格的过程(按像素方式或节点方式)。以下示例构建网格(2D数组)并计算样本数据的“网格坐标”。一旦它具有那些网格坐标(在true中只是数组索引),您可以将这些元素设置为True。请检查以下示例:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(0,1,1000)
y = np.random.normal(0,1,1000)

##### BUILDING A GRID FOR THE DATA ########
nodesx,nodesy = 100,100   # PIXELS IN X, PIXELS IN Y
firstx,firsty = x.min(),y.min()
sizex = (x.max()-x.min())/nodesx
sizey = (y.max()-y.min())/nodesy
grid = np.zeros((nodesx+1,nodesy+1),dtype='bool') # PLUS 1 TO ENSURE ALL DATA IS INSIDE GRID

# CALCULATING GRID COORDINATES OF DATA
indx = np.int_((x-firstx)/sizex)
indy = np.int_((y-firsty)/sizey)
grid[indx,indy] = True  # WHERE DATA EXISTS SET TRUE

# PLOT MY FINAL IMAGE
plt.imshow(grid.T,origin='lower',cmap='binary',interpolation='nearest')
plt.show()

,结果是:

small pixels in imshow

注意我正在使用imshow显示图像。我应该减少像素数(20,20 = nodesx,nodesy)我得到:

big pixels in imshow

另外,对于matplotlib中更自动的情节,您可以考虑hexbin