需要用文本fi中的5个随机数据集绘制散点图

2024-10-03 04:35:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要读取大约5000个数据集,每个数据集有多个值。从那以后,我需要设置被认为是“良好价值”的条件。我想我已经做到了这一点,从这个新的总体样本子集中,我需要随机选择5个数据集,并绘制它们的波长与通量

我曾尝试使用for循环读取随机选择的数据集的“id”,但它总是返回相同的数字。每个数据集都有三个条件值,如for gal in allgal循环所示,该循环选择具有良好数据点的星系

import random
import numpy as np
from numpy.polynomial.polynomial import polyfit
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import csv
import math
from collections import Counter

galnum = []
goodgal = []
xval = [3650, 4450, 5510, 6580, 8060, 9000, 12200, 21900]
yval = []


class Galaxy:
    def __init__(self, id , ra , dec , x , y , hawkiks_tot , k_flag , k_star , k_fluxrad , totmask , hawkiks , ehawkiks , vimosu , evimosu , vimosb , \
        evimosb , vimosv , evimosv , vimosr , evimosr , vimosi , evimosi , decamz , edecamz , fourstarj1 , efourstarj1 , hawkij , ehawkij , \
        irac1 , eirac1 , irac2, eirac2 , irac3 , eirac3 , irac4 , eirac4):
        self.id    = int(id)
        self.hawkiks_tot    = float(hawkiks_tot)
        self.k_flag = int(k_flag)
        self.totmask    = int(totmask)
        self.hawkiks    = float(hawkiks)
        self.vimosu    = float(vimosu)
        self.vimosb    = float(vimosb)
        self.vimosv    = float(vimosv)
        self.vimosr    = float(vimosr)
        self.vimosi    = float(vimosi)
        self.decamz    = float(decamz)
        self.hawkij    = float(hawkij)

    def __str__(self):
        return id + ' ' + hawkiks_tot + ' ' + k_flag + ' ' + totmask + ' ' + hawkiks + ' ' + vimosu + ' ' + vimosb + ' ' \
               + vimosv + ' ' + vimosr + ' ' + vimosi + ' ' + decamz + ' ' + hawkij


allgal = []

with open('/home/jacob/PHOTOMETRY/PHOTOM_CATS/SpARCS-0035_totalall_HAWKIKs.cat', 'r') as magfile:
    magplots = csv.reader(magfile)
    firstmagline = magfile.readline()
    for line in magfile:
        id , ra , dec , x , y , hawkiks_tot , k_flag , k_star , k_fluxrad , totmask , hawkiks , ehawkiks , vimosu , evimosu , vimosb , \
        evimosb , vimosv , evimosv , vimosr , evimosr , vimosi , evimosi , decamz , edecamz , fourstarj1 , efourstarj1 , hawkij , ehawkij , \
        irac1 , eirac1 , irac2, eirac2 , irac3 , eirac3 , irac4 , eirac4 = line.split()

        gal = Galaxy(id , ra , dec , x , y , hawkiks_tot , k_flag , k_star , k_fluxrad , totmask , hawkiks , ehawkiks , vimosu , evimosu , vimosb , \
        evimosb , vimosv , evimosv , vimosr , evimosr , vimosi , evimosi , decamz , edecamz , fourstarj1 , efourstarj1 , hawkij , ehawkij , \
        irac1 , eirac1 , irac2, eirac2 , irac3 , eirac3 , irac4 , eirac4)

        allgal.append(gal)


for gal in allgal:
    if gal.k_flag == 0 and gal.totmask == 0 and -2.5*math.log10(gal.hawkiks_tot) + 25 < 23:
        goodgal.append(gal)


random.seed(21)
sample_list = random.sample(goodgal, k=5)
print(sample_list)      #IDs: 2279, 3914, 3016, 4310, 2638

for goodgal in sample_list:
    print(id)

最后一个for循环只是确保for循环输出的id与随机数生成器的id匹配,如代码中的注释行所示。但它总是打印出4889,这是最后一个数据集ID号。我不明白为什么会出现这种情况,因为random.sample()中指定星系的ID甚至没有这个ID。它一直打印出48894889488948894889。虽然它应该打印出“227939141301643102638”。这只是一个检查,以确保所有内容都被正确阅读。我想做的基本上是读出不同的通量(由hawkiks、vimosv、vimosb等给出),将它们附加到yval数组中,然后根据波长(xval数组)和通量(yval数组)为每个星系(数据集)绘制5个单独的图


Tags: 数据importselfidforfloatflaggal