当前位置: 首页 > 知识库问答 >
问题:

Python:如何在一个直方图中绘制多个列

山疏珂
2023-03-14

我正在学习python,而我一直坚持的是基于FLT列绘制一个直方图来指示每个过滤器。我有这个数据框:

    VARLIST:      MJD FLT  FIELD  FLUXCAL  FLUXCALERR     MAG  MAGERR  \
0       OBS:  55161.6   g    NaN  -62.016      23.428     NaN  -0.410   
1       OBS:  55176.6   g    NaN   -8.183      21.252     NaN  -2.820   
2       OBS:  55179.6   g    NaN    0.451      19.109  -4.134  46.053   
3       OBS:  55188.6   g    NaN  511.964      21.218 -11.773   0.045   
4       OBS:  55206.6   g    NaN  682.704      22.329 -12.086   0.036   
..       ...      ...  ..    ...      ...         ...     ...     ...   
259     OBS:  56659.6   z    NaN  193.577      44.434 -10.717   0.249   
260     OBS:  56662.6   z    NaN    2.728      30.422  -6.089  12.109   
261     OBS:  56667.7   z    NaN   51.009      30.915  -9.269   0.658   
262     OBS:  56681.5   z    NaN    8.945      30.450  -7.379   3.696   
263     OBS:  56754.3   z    NaN   12.488      60.586  -7.741   5.268   

     peakMJD  mag_zpt27.5  snr_zpt27.5  magerr_zpt27.5  
0    55206.6    23.018741    -2.647089       -0.410262  
1    55206.6    25.217719    -0.385046       -2.820441  
2    55206.6    28.364559     0.023601       46.014133  
3    55206.6    20.726901    24.128759        0.045009  
4    55206.6    20.414419    30.574768        0.035519  
..       ...          ...          ...             ...  
259  55206.6    21.782866     4.356506        0.249282  
260  55206.6    26.410389     0.089672       12.110811  
261  55206.6    23.230883     1.649976        0.658191  
262  55206.6    25.121049     0.293760        3.696892  
263  55206.6    24.758768     0.206120        5.268770 

我的目标是绘制FLT列,但要指示不同的过滤器:g、i、r和z。通过搜索如何绘制直方图,我可以根据MAG(幅值)绘制基本的直方图。理想情况下,我想要的是4种不同的颜色来表示不同的过滤器。我知道该图将有重叠的磁过滤器,但我同意它,因为我需要一个视觉,我可以放大,如果我有必要。

下面的代码是我现在拥有的。现在这是最基本的,因为我一直在看留档,毫无进展。值得注意的是,中间有一堆关于我尝试的评论。一种是遍历每一行,查看过滤器,然后查看图表,但我不明白。另一个想法是创建4个新列,每个筛选器一个,然后绘制每个列。我被卡住了,想不通。

#HISTOGRAM
def plot_histogram(source, data_file):
    if source == 'villar':
        filename, ext = os.path.splitext(data_file)
        SnName_villar = filename[34:-6]

        # read in for clarifying info
        ps1_phot_info = pd.read_csv(data_file)

        ra_deg = ps1_phot_info.loc[2][0][11:19] #deg
        dec_deg = ps1_phot_info.loc[3][0][12:19] #deg
        final_z_villar = ps1_phot_info.loc[5][0][17:23] 

        # read in for data
        ps1_phot = pd.read_csv(data_file, skiprows=15, delim_whitespace=True)
        ps1_phot.drop(ps1_phot.tail(1).index,inplace=True)

        ps1_phot['peakMJD'] = ps1_phot.iloc[ps1_phot['FLUXCAL'].idxmax()]["MJD"] 
        
        # Calculate mag. Look at zeropoints (A. Villar = 32.5, YSE = 27.5)
        ps1_phot['mag_zpt27.5'] = np.array(-2.5*np.log10(np.abs(ps1_phot['FLUXCAL'])))+27.5
        ps1_phot['snr_zpt27.5'] = (ps1_phot['FLUXCAL'] / np.abs(ps1_phot['FLUXCALERR']))
        ps1_phot['magerr_zpt27.5'] = np.array(1.086 / ps1_phot['snr_zpt27.5'])



        mask = (ps1_phot['FLUXCAL'].notna()) #& (ps1_phot['FLUXCALERR'] <= 50) 
        ps1_masked = ps1_phot.loc[mask] #has mag obs and reasonable error

        print(ps1_masked)


        ps1_phot['peakMJD'] = ps1_phot.iloc[ps1_phot['FLUXCAL'].idxmax()]["MJD"] 
        print('here')
        print(ps1_phot)

        #Calculate mag. Look at zeropoints (A. Villar = 32.5, YSE = 27.5)
        ps1_phot['mag_zpt27.5'] = np.array(-2.5*np.log10(np.abs(ps1_phot['FLUXCAL'])))+27.5
        ps1_phot['snr_zpt27.5'] = (ps1_phot['FLUXCAL'] / np.abs(ps1_phot['FLUXCALERR']))
        ps1_phot['magerr_zpt27.5'] = np.array(1.086 / ps1_phot['snr_zpt27.5'])



        mask = (ps1_phot['FLUXCAL'].notna()) #& (ps1_phot['FLUXCALERR'] <= 50) 
        ps1_masked = ps1_phot.loc[mask] #has mag obs and reasonable error

        #print(ps1_masked)
        #ps1_phot['g_band'] = ps1_phot.iloc[ps1_phot['FLT']=='g']
        #print("THIS IS THE G BAND")
        #print(ps1_masked)
        #ps1_phot['r_band'] = ps1_phot.iloc[ps1_phot['FLT']=='r']
        #print("THIS IS THE R BAND")
        #print(ps1_masked)
        #ps1_phot['i_band'] = ps1_phot.iloc[ps1_phot['FLT']=='i']
        #print("THIS IS THE I BAND")
        #print(ps1_masked)
        #ps1_phot['z_band'] = ps1_phot.iloc[ps1_phot['FLT']=='z']
        #print("THIS IS THE Z BAND")
        #print(ps1_masked)
        
        #for pb in passbands:
        #    plt.hist(x=ps1_masked[''])

        #numpy.histogram(a, bins=10, range=None, normed=None, weights=None, density=None)[source]
        
        
        #passbands = ('g', 'r', 'i', 'z')
        #for pb in passbands:
        #    #x = passbands[pd]
            
        #    #blah blah code --> Plot histogram
        #    #errorbar only for scatter plot
        #    ax1.errorbar(x=ps1_masked[passbands[pd]]['MJD'] - ps1_masked[passbands[pd]]['peakMJD'], y=ps1_masked[passbands[pd]][f'{yaxis_is}'], yerr=ps1_masked[passbands[pd]][f'{yaxiserr_is}'],
        #    fmt='o', alpha=0.5, color='g', label=f'{x}-PS1')
        #ax1.ticklabel_format(useOffset=False, style='plain')
        
        yaxis_is = 'mag_zpt27.5' # or FLUXCAL
        yaxiserr_is = 'magerr_zpt27.5' # or FLUXCALERR
        
        fig = plt.figure(figsize=(12, 4))
        ax1 = fig.add_subplot(121)

        ax1.set_ylabel('Observations', fontsize=16)
        ax1.set_xlabel('Mag', fontsize=16)
        ax1.tick_params(labelsize=12)
        ax1.set_title(f'{SnName_yse}, z_yse={final_z_yse}; {SnName_villar}, z_villar={final_z_villar}', fontsize=16)

        #Plot

        ps1_phot['mag_zpt27.5'].hist()
        plt.savefig(f"path/to/file/my_plot_{pb}.png")

        plt.tight_layout()
        plt.show()

        fig.savefig(f'./Villar_Data_Graphs/{SnName_villar}_{SnName_yse}_{yaxis_is}_Histogram.png', format='png', bbox_inches='tight', dpi=300)    
        plt.close(fig) 
    
    
    #Read all the files "fileV = sorted(glob.glob('./Villar/ps1_sne_zenodo/*.dat'))" and then supernova type (has the same) 
    # check the redshift to see if the are comparable (range +/- 0.1)

这就是我调用上述函数的地方

x = './Villar/ps1_sne_zenodo/PS1_PS1MD_PSc000186.snana.dat'
SnName_villar, final_z_villar, ps1_masked_g, ps1_masked_r, ps1_masked_i, ps1_masked_z = get_dataframes(source='villar', data_file=x, plot_color='c', sntype_label='VIa')

y = './Photpipe/yselc_v3_photoz/GPC1v3_2020add.snana.dat'
SnName_yse, final_z_yse, pp_phot_g, pp_phot_r, pp_phot_i, pp_phot_z = get_dataframes(source='yse', data_file=y, plot_color='b', sntype_label='VIa')

plot_villar_and_yse(SnName_villar, final_z_villar, ps1_masked_g, ps1_masked_r, ps1_masked_i, ps1_masked_z, 
              SnName_yse, final_z_yse, pp_phot_g, pp_phot_r, pp_phot_i, pp_phot_z)


plot_histogram(source='villar', data_file=x)
#Call and plot histogram function

请让我知道你的想法和建议。

共有2个答案

龚睿
2023-03-14

海运是一条路。要绘制发行版,您可以在海运库中使用几个选项:sns.distplot()、sns.kdeplot()、sns.boxplot()、sns.histplot()。就我个人而言,我喜欢使用sns.distplot(),因为它为您提供了显示直方图和曲线的选项。

陆啸
2023-03-14

这可以相对简单地使用Seborn的hist图函数来完成。

import pandas as pd
import numpy as np
import seaborn as sns

# construct some sample data
ps1_phot = pd.concat([pd.DataFrame({'FLT': flt, 'MAG': np.random.randn(1000) + i}) for i, flt in enumerate('girz')])

# plot overlapping histograms
sns.histplot(ps1_phot.dropna(subset=['MAG']), x='MAG', hue='FLT')

导致

 类似资料:
  • 我是Python的大一新生,我有一个问题是如何在python中绘制直方图。 首先,我有十个间隔,根据花的花瓣长度平均划分,从最小到最大。因此,我可以根据花瓣将花分成十个间隔。 花的种类是三个,所以我想画一个直方图来描述不同种类的花在不同间隔(箱)中的分布。在同一个垃圾桶里,不同的花有不同的颜色。 我知道Matplotlib中的函数,但是我不知道如何使用它来绘制像下面这样的图片。 数据是和

  • 使用matplotlib时,我可以使用{importmatplotlib.pyplotas plt}因为我使用Tkinter,所以我也会使用PicreCanvasTkAgg来做同样的事情 有人能帮我在如何实现matplotlib的停顿效果在菲格勒CanvasTkAgg。

  • 我已经问了同样的问题,看起来不清楚。因此,让我以不同的方式问它。我有四个.csv个名为I_earthquake2016.csv I_earthquake2017.csv I_earthquake2018.csv I_earthquake2019.csv(不同年份的地震数据)它们都有相同的列,只是行数不同。我做了一些代码来读取其中一个文件,并制作直方图以查看每个月发生多少次地震。 问题: < li

  • 我有下面的脚本,当我在第二个数据集中有第三列时,它可以正常工作。现在,我想获得绘制的第一个带有错误条的直方图,第二个带有错误条。我可以从第二个plot命令中删除,但是gnuplot会抱怨没有为第二个直方图指定足够的数据。如果我删除

  • 可以帮我弄清楚怎么用matplotlib画这种图吗? 我有一个熊猫数据框对象来表示这个表: 我想可视化每个< code >图形的< code>n和< code>m的大小:一个水平条形图,其中每一行在y轴的左侧都有一个包含< code >图形名称的标签;在y轴的右边,有两个细的水平条,一个在另一个的正下方,其长度代表< code>n和< code>m。应该可以清楚地看到,两个细条都属于标有图形名称的

  • 本文向大家介绍python 实现在一张图中绘制一个小的子图方法,包括了python 实现在一张图中绘制一个小的子图方法的使用技巧和注意事项,需要的朋友参考一下 有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法。 以上这篇python 实现在一张图中绘制一个小的子图方法就是小编分享给大家的