Exemplo n.º 1
0
def fig_0f1(Rpc, ds_sim, k, mass_bin):
    test_read_m16_ds_1(mass_bin=mass_bin)
    plt.plot(Rpc[:], ds_sim[k, :], '--')
    nn = ds_sim[k, :].size  #求样本大小
    x_mean = np.mean(ds_sim[k, :])  #求算术平均值
    x_std = np.std(ds_sim[k, :])  #求标准偏差
    x_se = x_std / np.sqrt(nn)  #求标准误差
    dof = nn - 1  #自由度计算
    alpha = 1.0 - 0.95
    conf_region = st.ppf(1-alpha/2.,dof)*x_std*\
    np.sqrt(1.+1./nn)#设置置信区间
    plt.errorbar(Rpc[:], ds_sim[k, :], yerr=x_std, fmt='-', linewidth=0.5)
    plt.xlabel(r'$R-Mpc/h$')
    plt.ylabel(r'$\Delta\Sigma-hM_\odot/{pc^2}$')
    return x_mean, x_se, conf_region
Exemplo n.º 2
0
def fig_mass(pp):
    m_bin = ['10.0_10.4', '10.4_10.7', '10.7_11.0', '11.0_15.0']
    mbin = [10.2, 10.55, 10.9, 13.0]
    #作图取点
    m, N, z = input_mass_bin(v=True)
    z_use = np.zeros((len(m_bin), 2), dtype=np.float)
    ##计算误差棒并存储的数组
    err_bar_r = np.zeros((len(m_bin), 2), dtype=np.float)
    err_bar_b = np.zeros((len(m_bin), 2), dtype=np.float)
    for k in range(0, len(m_bin)):
        if k == len(m_bin) - 1:
            z_use[k, :] = z[:, -1]
        else:
            z_use[k, :] = z[:, k]
    print(z_use)
    #print(m_bin)
    #该句导入拟合质量
    Pr_mh = np.zeros((len(m_bin), 2), dtype=np.float)
    b_m_r = np.zeros(len(m_bin), dtype=np.float)
    b_m_b = np.zeros(len(m_bin), dtype=np.float)
    #Pr_mh的第一行存red的质量,第二行存blue的质量,x_std也一样
    for k in range(0, len(m_bin)):
        rp, best_mr, delta_r, bestfmr = fit_datar_1(m_bin[k], z_use[k, 0], k)
        rp, best_mb, delta_b, bestfmb = fit_datab_1(m_bin[k], z_use[k, 1], k)
        Pr_mh[k, 0] = best_mr
        Pr_mh[k, 1] = best_mb
        b_m_r[k] = bestfmr
        b_m_b[k] = bestfmb
        ##下面把x^2转化为相应的概率分布,并让mh的划分区间服从这个分布
        mr = m[k]
        mb = m[k]
        rsa, dssa, ds_errsa = test_read_m16_ds_1(mass_bin=m_bin[k])
        pr = np.ones(len(m[k]), dtype=np.float)
        pb = np.ones(len(m[k]), dtype=np.float)
        ds_errsar = ds_errsa[0, 0:len(rp)]
        ds_errsab = ds_errsa[1, 0:len(rp)]
        for q in range(0, len(mr)):
            ss = 1
            for t in range(0, len(rp)):
                ss = ss * (1 / (np.sqrt(np.pi * 2) * ds_errsar[t])) * np.exp(
                    (-1 / 2) * delta_r[q])
            pr[q] = ss
        for q in range(0, len(mb)):
            qq = 1
            for t in range(0, len(rp)):
                qq = qq * (1 / (np.sqrt(np.pi * 2) * ds_errsab[t])) * np.exp(
                    (-1 / 2) * delta_b[q])
            pb[q] = qq
        ##第一次归一化,把概率密度函数归一到0~1之间
        pr = (pr - np.min(pr)) / (np.max(pr) - np.min(pr))
        pb = (pb - np.min(pb)) / (np.max(pb) - np.min(pb))
        '''
        plt.figure()
        plt.plot(mr,pr,'r')
        plt.title('Probability distribution')
        plt.xlabel(r'$log(M_h/M_\odot)$')
        plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$')
        plt.show()
        plt.plot(mb,pb,'b')
        plt.title('Probability distribution')
        plt.xlabel(r'$log(M_h/M_\odot)$')
        plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$')
        plt.show()
        '''
        #print('r=',delta_r)
        #print('b=',delta_b)
        ##第二次归一化,目的是让所有概率求和为1
        fr = np.zeros(len(mr), dtype=np.float)
        fb = np.zeros(len(mb), dtype=np.float)
        ss = 0
        qq = 0
        Fr = np.zeros(len(mr), dtype=np.float)
        Fb = np.zeros(len(mb), dtype=np.float)
        for q in range(0, len(mr)):
            ss = ss + pr[q] * (mr[1] - mr[0])
            fr[q] = ss
        for q in range(0, len(mb)):
            qq = qq + pb[q] * (mb[1] - mb[0])
            fb[q] = qq
        Ar = np.max(fr)
        Ab = np.max(fb)
        ss = 0
        qq = 0
        for q in range(0, len(mr)):
            ss = ss + pr[q] * (mr[1] - mr[0]) / Ar
            Fr[q] = ss
        for q in range(0, len(mb)):
            qq = qq + pb[q] * (mb[1] - mb[0]) / Ab
            Fb[q] = qq
        #plt.figure()
        #plt.plot(mr,Fr,'r')
        #plt.show()
        #plt.plot(mb,Fb,'b')
        #plt.show()
        vr = np.interp(0.16, Fr, mr)
        ur = np.interp(0.84, Fr, mr)
        err_bar_r[k, :] = [vr - bestfmr, ur - bestfmr]
        vb = np.interp(0.16, Fb, mb)
        ub = np.interp(0.84, Fb, mb)
        err_bar_b[k, :] = [vb - bestfmb, ub - bestfmb]
    ##对应for循环前面的plt.figure
    #print('phy_mr=',Pr_mh[:,0])
    #print('phy_mb=',Pr_mh[:,1])
    #print('errbar_r=',err_bar_r)
    #print('errbar_b=',err_bar_b)
    #####注意errorbar作图命令
    plt.figure()
    color_list = ['r', 'b', 'g']
    line1, caps1, bars1 = plt.errorbar(mbin,
                                       Pr_mh[:, 0],
                                       yerr=[err_bar_r[:, 0], err_bar_r[:, 1]],
                                       fmt="ks-",
                                       linewidth=1,
                                       elinewidth=0.5,
                                       ecolor='k',
                                       capsize=1,
                                       capthick=0.5,
                                       label='red')
    line3, caps3, bars3 = plt.errorbar(mbin,
                                       Pr_mh[:, 1],
                                       yerr=[err_bar_b[:, 0], err_bar_b[:, 1]],
                                       fmt="k^-",
                                       linewidth=1,
                                       elinewidth=0.5,
                                       ecolor='k',
                                       capsize=1,
                                       capthick=0.5,
                                       label='blue')
    plt.fill_between(mbin,
                     Pr_mh[:, 0] + err_bar_r[:, 0],
                     Pr_mh[:, 0] + err_bar_r[:, 1],
                     facecolor=color_list[0],
                     alpha=.20)
    plt.fill_between(mbin,
                     Pr_mh[:, 1] + err_bar_b[:, 0],
                     Pr_mh[:, 1] + err_bar_b[:, 1],
                     facecolor=color_list[1],
                     alpha=.20)
    plt.xlabel(r'$log[M_\ast/M_\odot]$')
    plt.ylabel(r'$log{\langle M_{200} \rangle/[M_\odot h^{-1}]}$')
    plt.legend(loc=2)
    plt.title(r'$Standard Deviation-1\sigma_{p}$')
    plt.axis([10, 14, 11, 14])
    #plt.savefig('Standard_deviation.png',dpi=600)
    plt.show()
    return Pr_mh
Exemplo n.º 3
0
def fit_datab_1(mass_bin, z_int, T):
    h = 0.673
    #先找出观测值对应的rp
    #rsa,dssa,ds_errsa = test_read_m16_ds_1()
    rsa, dssa, ds_errsa = test_read_m16_ds_1(mass_bin=mass_bin)
    # print('ds=',dssa)
    # print('ds_err=',ds_errsa)
    #print('rp=',rsa)
    #a = np.shape(dssa)
    #print('size a=',a)
    ##注意到观测数值选取的是物理坐标,需要靠里尺度银子修正,修正如下
    #z_b = 0.1
    #a_b = 1/(1+z_b)
    ##此时对于预测的R也要做修正
    rp = np.array(
        [rsa[0, k] for k in range(0, len(rsa[0, :])) if rsa[0, k] * h <= 5])
    # rp = [rsa[0,k] for k in range(0,len(rsa[0,:])) if rsa[0,k]*h<=2]
    # rp = rsa[0,:]
    #该句直接对数组筛选,计算2Mpc以内(保证NFW模型适用的情况下)信号
    #print(rp)
    b = len(rp)
    m, N, z = input_mass_bin(v=True)
    mb = m[T]
    #print('mr=',mb)
    lm_bin = len(mb)
    #下面做两组数据的方差比较,注意不能对观测数据进行插值
    #比较方法,找出观测的sigma数值对应的Rp,再根据模型计算此时的模型数值Sigma(该步以完成)
    ds_simb = np.zeros((lm_bin, b), dtype=np.float)
    #rb = np.zeros(lm_bin,dtype=np.float)
    #该句对应下面作图部分
    for t in range(0, lm_bin):
        m_ = 1
        x = mb[t]
        z_b = z_int
        #Rpc = rp
        #Rpc,Sigma,deltaSigma = calcu_sigma(Rpc,m_,x)
        #ds_simr[k,t,:] = deltaSigma
        #对比文献,加入尺度因子修正如下,把物理的距离转为共动的距离
        #计算模型在对应的投射距离上的预测信号取值
        Rpc = rp
        Rpc, Sigma, deltaSigma, rs = calcu_sigmaz(Rpc, m_, x, z_b)
        #对预测信号做相应的变化,把共动的转为物理的
        ds_simb[t, :] = deltaSigma
        ##下面部分作图对比
        #rb[t] = rs
        #fig_0f1(rp,ds_simb,t,mass_bin)
    #plt.title('Blue')
    #plt.legend(m[:],bbox_to_anchor=(1,1))
    #plt.legend(m[:])
    #plt.savefig('Fit-blue2.png',dpi=600)
    #plt.savefig('compare_2_bl.png',dpi=600)
    #plt.show()
    yy = np.shape(ds_simb)
    #print('rr=',rr)#输出查看ds_sim的维度,即模型预测下的透镜信号
    #比较观测的sigma和预测的Sigma,比较结果用fitr和fitb记录比较结果
    delta_b = np.zeros(lm_bin, dtype=np.float)
    for t in range(0, lm_bin):
        d_b = 0
        for n in range(0, yy[1]):
            d_b = d_b + ((ds_simb[t, n] - dssa[1, n]) / ds_errsa[1, n])**2
        delta_b[t] = d_b
    #print(delta_r)
    #下面这段求每个质量级对应的方差最小值
    deltab = delta_b.tolist()
    xb = deltab.index(min(deltab))
    bestfmb = mb[xb]
    best_mb = bestfmb + np.log10(h)
    #作图对比最佳情况
    '''
    plt.figure()
    k = xb
    fig_0f1(rp,ds_simb,k,mass_bin)
    plt.title('Blue')
    #plt.savefig('fit_r.png',dpi=600)
    plt.show()
    '''
    #print('x^2=',min(deltab))
    #print('mb=',best_mb)
    #print('positionr=',xb)
    return rp, best_mb, delta_b, bestfmb
def fig_mass(pp):
    m_bin = ['10.0_10.4', '10.4_10.7', '10.7_11.0', '11.0_15.0']
    mbin = [10.2, 10.55, 10.9, 13.0]
    #质量区间
    x_m = np.logspace(1, 1.18, 4)
    ##画图质量区间
    m, N = input_mass_bin(v=True)
    #print(m)
    #该句导入拟合质量
    Pr_mh = np.zeros((len(m_bin), 2), dtype=np.float)
    #保存以Msolar/h为单位的最佳质量
    b_m_r = np.zeros(len(m_bin), dtype=np.float)
    b_m_b = np.zeros(len(m_bin), dtype=np.float)
    #分别保存以Msolar为单位的最佳拟合质量
    x_std = np.zeros((len(m_bin), 2), dtype=np.float)
    #Pr_mh的第一行存red的质量,第二行存blue的质量,x_std也一样
    ##计算误差棒并存储的数组
    err_bar_r = np.zeros((len(m_bin), 2), dtype=np.float)
    err_bar_b = np.zeros((len(m_bin), 2), dtype=np.float)
    ##为了X^2检测,需要记录并提取每一个m*区间的概率分布(Ps:不是概率密度分布)
    Dp_r = np.array([np.zeros(len(m[1]),dtype=np.float),np.zeros(len(m[2]),dtype=np.float),\
                  np.zeros(len(m[2]),dtype=np.float),np.zeros(len(m[3]),dtype=np.float)])
    Dp_b = np.array([np.zeros(len(m[1]),dtype=np.float),np.zeros(len(m[2]),dtype=np.float),\
                  np.zeros(len(m[2]),dtype=np.float),np.zeros(len(m[3]),dtype=np.float)])
    ##记录最小的x^2的值,用于x^2检测
    c_xs_r = np.zeros(len(m_bin), dtype=np.float)
    c_xs_b = np.zeros(len(m_bin), dtype=np.float)
    ##尝试直接从chi-square出发,求出一倍sigma的误差棒函数
    D_chi_r = np.array([np.zeros(len(m[1]),dtype=np.float),np.zeros(len(m[2]),dtype=np.float),\
                  np.zeros(len(m[2]),dtype=np.float),np.zeros(len(m[3]),dtype=np.float)])
    D_chi_b = np.array([np.zeros(len(m[1]),dtype=np.float),np.zeros(len(m[2]),dtype=np.float),\
                  np.zeros(len(m[2]),dtype=np.float),np.zeros(len(m[3]),dtype=np.float)])
    for k in range(0, len(m_bin)):
        rp, best_mr, delta_r, bestfmr = fit_datar_1(m_bin[k], k)
        rp, best_mb, delta_b, bestfmb = fit_datab_1(m_bin[k], k)
        Pr_mh[k, 0] = best_mr
        Pr_mh[k, 1] = best_mb
        b_m_r[k] = bestfmr
        b_m_b[k] = bestfmb
        c_xs_r[k] = np.min(delta_r)
        c_xs_b[k] = np.min(delta_b)
        mr = m[k]
        mb = m[k]
        ##不考虑插值时直接带入mr,mb计算,求出误差棒
        ##考虑插值时,先对最佳拟合质量附近考虑插值,后续代码相应符号(mr_,mb_,or chir,chib)表示以插值部分量做计算
        mr_ = np.linspace(b_m_r[k] - 0.2, b_m_r[k] + 0.2, len(m[k]))
        mb_ = np.linspace(b_m_b[k] - 0.2, b_m_b[k] + 0.2, len(m[k]))
        chir = np.interp(mr_, mr, delta_r)
        chib = np.interp(mb_, mb, delta_b)
        ##chir,chib表示即将带入计算概率分布的X^2.
        ##下面几句直接从x^2求解1倍sigma对应的mh,为此需要先做如下处理,1-sigma的取值见后面
        dchir = delta_r - np.min(delta_r)
        dchib = delta_b - np.min(delta_b)
        D_chi_r[k] = dchir
        D_chi_b[k] = dchib
        ##下面把x^2转化为相应的概率分布,并让mh的划分区间服从这个分布
        rsa, dssa, ds_errsa = test_read_m16_ds_1(mass_bin=m_bin[k])
        pr = np.ones(len(m[k]), dtype=np.float)
        pb = np.ones(len(m[k]), dtype=np.float)
        pr_ = np.ones(len(m[k]), dtype=np.float)
        pb_ = np.ones(len(m[k]), dtype=np.float)
        ds_errsar = ds_errsa[0, 0:len(rp)]
        ds_errsab = ds_errsa[1, 0:len(rp)]
        ##假设x^2的数据分布服从高斯分布
        for q in range(0, len(mr)):
            ##未考虑插值的处理
            ss = 1
            for t in range(0, len(rp)):
                ss = ss * (1 / (np.sqrt(np.pi * 2) * ds_errsar[t])) * np.exp(
                    (-1 / 2) * delta_r[q])
            pr[q] = ss
        for q in range(0, len(mr_)):
            ##考虑插值的计算处理
            ss = 1
            for t in range(0, len(rp)):
                ss = ss * (1 / (np.sqrt(np.pi * 2) * ds_errsar[t])) * np.exp(
                    (-1 / 2) * chir[q])
            pr_[q] = ss
        for q in range(0, len(mb)):
            ##未考虑插值的处理
            qq = 1
            for t in range(0, len(rp)):
                qq = qq * (1 / (np.sqrt(np.pi * 2) * ds_errsab[t])) * np.exp(
                    (-1 / 2) * delta_b[q])
            pb[q] = qq
        for q in range(0, len(mb_)):
            ##考虑插值的计算处理
            qq = 1
            for t in range(0, len(rp)):
                qq = qq * (1 / (np.sqrt(np.pi * 2) * ds_errsab[t])) * np.exp(
                    (-1 / 2) * chib[q])
            pb_[q] = qq
        ##第一次归一化,把概率密度函数归一到0~1之间
        pr = (pr - np.min(pr)) / (np.max(pr) - np.min(pr))
        pb = (pb - np.min(pb)) / (np.max(pb) - np.min(pb))
        pr_ = (pr_ - np.min(pr_)) / (np.max(pr_) - np.min(pr_))
        pb_ = (pb_ - np.min(pb_)) / (np.max(pb_) - np.min(pb_))
        '''
        plt.figure()
        plt.plot(mr,pr,'r')
        plt.title('Probability distribution')
        plt.xlabel(r'$log(M_h/M_\odot)$')
        plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$')
        plt.show()
        plt.plot(mb,pb,'b')
        plt.title('Probability distribution')
        plt.xlabel(r'$log(M_h/M_\odot)$')
        plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$')
        plt.show()
        plt.figure()
        plt.plot(mr_,pr_,'r')
        plt.title('Probability distribution')
        plt.xlabel(r'$log(M_h/M_\odot)$')
        plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$')
        plt.show()
        plt.plot(mb_,pb_,'b')
        plt.title('Probability distribution')
        plt.xlabel(r'$log(M_h/M_\odot)$')
        plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$')
        plt.show()
        '''
        #print('r=',delta_r)
        #print('b=',delta_b)
        ##第二次归一化,目的是让所有概率求和为1
        ##未考虑插值的处理
        fr = np.zeros(len(mr), dtype=np.float)
        fb = np.zeros(len(mb), dtype=np.float)
        ##考虑插值的处理
        fr_ = np.zeros(len(mr_), dtype=np.float)
        fb_ = np.zeros(len(mb_), dtype=np.float)
        ss = 0
        qq = 0
        ##未考虑插值的处理
        Fr = np.zeros(len(mr), dtype=np.float)
        Fb = np.zeros(len(mb), dtype=np.float)
        ##考虑插值的处理
        Fr_ = np.zeros(len(mr_), dtype=np.float)
        Fb_ = np.zeros(len(mb_), dtype=np.float)
        ##在不考虑插值时调用该部分
        for q in range(0, len(mr)):
            ss = ss + pr[q] * (mr[1] - mr[0])
            fr[q] = ss
        ##考虑插值的处理
        for q in range(0, len(mr_)):
            ss = ss + pr[q] * (mr_[1] - mr_[0])
            fr_[q] = ss
        ##在不考虑插值时调用该部分
        for q in range(0, len(mb)):
            qq = qq + pb[q] * (mb[1] - mb[0])
            fb[q] = qq
        ##考虑插值的处理
        for q in range(0, len(mb_)):
            qq = qq + pb[q] * (mb_[1] - mb_[0])
            fb_[q] = qq
        Ar = np.max(fr)
        Ab = np.max(fb)
        Ar_ = np.max(fr)
        Ab_ = np.max(fb)
        ss = 0
        qq = 0
        ##在不考虑插值时调用该部分
        for q in range(0, len(mr)):
            ss = ss + pr[q] * (mr[1] - mr[0]) / Ar
            Fr[q] = ss
        ##考虑插值时调用该部分
        for q in range(0, len(mr_)):
            ss = ss + pr[q] * (mr_[1] - mr_[0]) / Ar
            Fr_[q] = ss
        ##在不考虑插值时调用该部分
        for q in range(0, len(mb)):
            qq = qq + pb[q] * (mb[1] - mb[0]) / Ab
            Fb[q] = qq
        ##考虑插值时调用该部分
        for q in range(0, len(mb_)):
            qq = qq + pb[q] * (mb_[1] - mb_[0]) / Ab
            Fb_[q] = qq
        #plt.figure()
        #plt.plot(mr,Fr,'r')
        #plt.show()
        #plt.plot(mb,Fb,'b')
        #plt.show()
        #plt.figure()
        #plt.plot(mr_,Fr_,'r')
        #plt.show()
        #plt.plot(mb_,Fb_,'b')
        #plt.show()
        vr = np.interp(0.16, Fr, mr)
        ur = np.interp(0.84, Fr, mr)
        err_bar_r[k, :] = [vr - bestfmr, ur - bestfmr]
        vb = np.interp(0.16, Fb, mb)
        ub = np.interp(0.84, Fb, mb)
        err_bar_b[k, :] = [vb - bestfmb, ub - bestfmb]
        ##记录每一次概率分布
        Dp_r[k] = pr
        Dp_b[k] = pb
    #print('phy_mr=',Pr_mh[:,0])
    #print('phy_mb=',Pr_mh[:,1])
    print('err_mr=', err_bar_r)
    print('err_mb=', err_bar_b)
    #scatter函数参数设置
    color_list = ['r', 'b', 'g']
    bar_list = ['s', '^', 'v']
    ##直接从概率分布得到误差棒
    plt.figure()
    line1, caps1, bars1 = plt.errorbar(mbin,
                                       Pr_mh[:, 0],
                                       yerr=[err_bar_r[:, 0], err_bar_r[:, 1]],
                                       fmt="rs-",
                                       linewidth=1,
                                       elinewidth=0.5,
                                       ecolor='k',
                                       capsize=1,
                                       capthick=0.5,
                                       label='red')
    line3, caps3, bars3 = plt.errorbar(mbin,
                                       Pr_mh[:, 1],
                                       yerr=[err_bar_b[:, 0], err_bar_b[:, 1]],
                                       fmt="b^-",
                                       linewidth=1,
                                       elinewidth=0.5,
                                       ecolor='k',
                                       capsize=1,
                                       capthick=0.5,
                                       label='blue')
    plt.fill_between(mbin,
                     Pr_mh[:, 0] + err_bar_r[:, 0],
                     Pr_mh[:, 0] + err_bar_r[:, 1],
                     facecolor=color_list[0],
                     alpha=.20)
    plt.fill_between(mbin,
                     Pr_mh[:, 1] + err_bar_b[:, 0],
                     Pr_mh[:, 1] + err_bar_b[:, 1],
                     facecolor=color_list[1],
                     alpha=.20)
    plt.xlabel(r'$log[M_\ast/M_\odot]$')
    plt.ylabel(r'$log{\langle M_{200} \rangle/[M_\odot h^{-1}]}$')
    plt.legend(loc=2)
    plt.title(r'$Standard Deviation-1\sigma_{p}$')
    plt.axis([10, 13.5, 11, 13.5])
    #plt.savefig('Standard_deviation-1.png',dpi=600)
    plt.show()
    ##比较X^2差值的变化
    ###(该部分同时说明怎么样循环生成排列子图)
    plt.figure()
    for k in range(0, 2 * len(m_bin)):
        plt.subplot(241 + k)
        if k <= 3:
            plt.plot(m[k], D_chi_r[k], 'r')
            plt.title(r'$\Delta\chi^2_{red}$')
            plt.axis([b_m_r[k] + 1, b_m_r[k] - 1, 0, 1])
        else:
            plt.plot(m[k - 4], D_chi_b[k - 4], 'b')
            plt.title(r'$\Delta\chi^2_{blue}$')
            plt.axis([b_m_b[k - 4] + 1, b_m_b[k - 4] - 1, 0, 1])
        plt.grid()
    plt.tight_layout()
    #plt.subplots_adjust(wspace=0,hspace=0)
    #plt.savefig('delta_x^2',dpi=600)
    plt.show()
    ##观察概率分布函数,在大质量端取样性应该越来越好
    plt.figure()
    for k in range(0, 2 * len(m_bin)):
        plt.subplot(241 + k)
        if k <= 3:
            plt.plot(m[k - 4], Dp_r[k - 4], 'r')
            plt.title(r'$probability_{red}$')
        else:
            plt.plot(m[k - 4], Dp_b[k - 4], 'b')
            plt.title(r'$Probability_{blue}$')
        plt.grid()
    plt.tight_layout()
    #plt.savefig('probability',dpi=600)
    plt.show()
    ##做出由x^2直接得到的1-sigma的误差棒图像
    ######注意插值函数的要求:在差值区间要求目标函数为单调递增函数
    Dchir = np.zeros((len(m_bin), 2), dtype=np.float)
    Dchib = np.zeros((len(m_bin), 2), dtype=np.float)
    for k in range(0, len(m_bin)):
        mr_ = m[k]
        mb_ = m[k]
        ##把相应的x^2的差值分两个区间
        Dchir1_ = D_chi_r[k]
        ix = mr_ < b_m_r[k]
        Dchir_1 = Dchir1_[ix]
        mr1 = mr_[ix]
        Dchir_2 = Dchir1_[~ix]
        mr2 = mr_[~ix]
        ##下面求1-sigma的点
        m_r1 = np.interp(-1.0, -Dchir_1, mr1)
        m_r2 = np.interp(1.0, Dchir_2, mr2)
        ##把相应的x^2的差值分两个区间
        Dchib1_ = D_chi_b[k]
        ix = mb_ < b_m_b[k]
        Dchib_1 = Dchib1_[ix]
        mb1 = mb_[ix]
        Dchib_2 = Dchib1_[~ix]
        mb2 = mb_[~ix]
        ##下面求1-sigma的点
        m_b1 = np.interp(-1.0, -Dchib_1, mb1)
        m_b2 = np.interp(1.0, Dchib_2, mb2)
        ##插值后比较
        Dchir[k, :] = np.array([m_r1 - b_m_r[k], m_r2 - b_m_r[k]])
        Dchib[k, :] = np.array([m_b1 - b_m_b[k], m_b2 - b_m_b[k]])
    print(Dchir)
    print(Dchib)
    plt.figure()
    line1, caps1, bars1 = plt.errorbar(mbin,
                                       Pr_mh[:, 0],
                                       yerr=[err_bar_r[:, 0], err_bar_r[:, 1]],
                                       fmt="rs-",
                                       linewidth=1,
                                       elinewidth=0.5,
                                       ecolor='k',
                                       capsize=1,
                                       capthick=0.5,
                                       label='red')
    line3, caps3, bars3 = plt.errorbar(mbin,
                                       Pr_mh[:, 1],
                                       yerr=[err_bar_b[:, 0], err_bar_b[:, 1]],
                                       fmt="b^-",
                                       linewidth=1,
                                       elinewidth=0.5,
                                       ecolor='k',
                                       capsize=1,
                                       capthick=0.5,
                                       label='blue')
    plt.fill_between(mbin,
                     Pr_mh[:, 0] + err_bar_r[:, 0],
                     Pr_mh[:, 0] + err_bar_r[:, 1],
                     facecolor=color_list[0],
                     alpha=.20)
    plt.fill_between(mbin,
                     Pr_mh[:, 1] + err_bar_b[:, 0],
                     Pr_mh[:, 1] + err_bar_b[:, 1],
                     facecolor=color_list[1],
                     alpha=.20)
    plt.xlabel(r'$log[M_\ast/M_\odot]$')
    plt.ylabel(r'$log{\langle M_{200} \rangle/[M_\odot h^{-1}]}$')
    plt.legend(loc=4)
    plt.title(r'$Standard Deviation-1\sigma_{\chi^2}$')
    plt.axis([10, 13.5, 11, 14])
    #plt.savefig('Standard_deviation.png',dpi=600)
    plt.show()
    ##下面部分做x^2检测
    print('min_x^2_r=', c_xs_r)
    print('min_x^2_b=', c_xs_b)
    return Pr_mh
def fit_datar_1(mass_bin, T):
    h = 0.7
    #先找出观测值对应的rp
    #rsa,dssa,ds_errsa = test_read_m16_ds_1()
    rsa, dssa, ds_errsa = test_read_m16_ds_1(mass_bin=mass_bin)
    # print('ds=',dssa)
    # print('ds_err=',ds_errsa)
    #print('rp=',rsa)
    a = np.shape(dssa)
    #print('size a=',a)
    ##注意到观测数值选取的是物理坐标,需要靠里尺度银子修正,修正如下
    z_r = 0.1
    #z_r = 0.105
    a_r = 1 / (1 + z_r)
    ##此时对于预测的R也要做修正
    rp = np.array(
        [rsa[0, k] for k in range(0, len(rsa[0, :])) if rsa[0, k] * h <= 5])
    #rp = [rsa[0,k] for k in range(0,len(rsa[0,:])) if rsa[0,k]*h<=2]
    #该句直接对数组筛选,计算2Mpc以内(保证NFW模型适用的情况下)信号
    b = len(rp)
    m, N = input_mass_bin(v=True)
    mr = m[T]
    #print('mr=',mr)
    lm_bin = len(mr)
    #下面做两组数据的方差比较,注意不能对观测数据进行插值
    #比较方法,找出观测的sigma数值对应的Rp,再根据模型计算此时的模型数值Sigma(该步以完成)
    ds_simr = np.zeros((lm_bin, b), dtype=np.float)
    #rr = np.zeros(lm_bin,dtype=np.float)
    for t in range(0, lm_bin):
        m_ = 1
        x = mr[t]
        #Rpc = rp
        #Rpc,Sigma,deltaSigma = calcu_sigma(Rpc,m_,x)
        #ds_simr[k,t,:] = deltaSigma
        #对比文献,加入尺度因子修正如下,把物理的距离转为共动的距离
        #计算模型在对应的投射距离上的预测信号取值
        Rpc = rp
        Rpc, Sigma, deltaSigma, rs = calcu_sigmaz(Rpc, m_, x, z_r)
        #对预测信号做相应的变化,把共动的转为物理的
        ds_simr[t, :] = deltaSigma
        #下面部分作图对比
        #rr[t] = rs
        #fig_0f1(rp,ds_simr,t,mass_bin)
    #plt.title('Red')
    #plt.legend(m[:],bbox_to_anchor=(1,1))
    #plt.legend(m[:])
    #plt.savefig('Fit-red2.png',dpi=600)
    #plt.savefig('compare_1_rd.png',dpi=600)
    #plt.show()
    yy = np.shape(ds_simr)
    #比较观测的sigma和预测的Sigma,比较结果用fitr和fitb记录比较结果
    delta_r = np.zeros(lm_bin, dtype=np.float)
    for t in range(0, lm_bin):
        d_r = 0
        for n in range(0, yy[1]):
            d_r = d_r + ((ds_simr[t, n] - dssa[0, n]) / ds_errsa[0, n])**2
        delta_r[t] = d_r
    #print(delta_r)
    #下面这段求每个质量级对应的方差最小值
    deltar = delta_r.tolist()
    xr = deltar.index(min(deltar))
    bestfmr = mr[xr]
    best_mr = bestfmr + np.log10(h)
    #作图对比最佳情况
    '''
    plt.figure()
    k = xr
    fig_0f1(rp,ds_simr,k,mass_bin)
    plt.title('Red')
    #plt.savefig('fit_r.png',dpi=600)
    plt.show()
    '''
    #print('x^2=',min(deltar))
    #print('mr=',best_mr)
    #print('positionr=',xr)
    return rp, best_mr, delta_r, bestfmr