Python astropy.units 模块,degree() 实例源码

我们从Python开源项目中,提取了以下17个代码示例,用于说明如何使用astropy.units.degree()

项目:CTAtools    作者:davidsanchez    | 项目源码 | 文件源码
def __init__(self,x,y, frame = FK5):
        ''' init function
        Parameters
        ---------
        x  : float, first coordinate of the source
        f  : float, second coordinate of the source
        frame   : Astropy coordinate frame ICRS, Galactic, FK4, FK5 , see astropy for more information
        '''
        self.frame = frame
        try :
            self.skycoord = SkyCoord(x, y, frame=frame)
        except:
            self.skycoord = SkyCoord(x*u.degree, y*u.degree, frame=frame)

        try :
            self.X = self.skycoord.ra
            self.Y = self.skycoord.dec
        except:
            self.X = self.skycoord.l
            self.Y = self.skycoord.b

        self.to_string = self.skycoord.to_string

        self.to_string = self.skycoord.to_string
        self.frame = self.skycoord.frame.name
项目:ngas    作者:ICRAR    | 项目源码 | 文件源码
def overlap_check(ra, dec, radius):
    """
    A very rough implementation, not using any distance or coverage calculation
    for efficiency
    """
    for i, re in enumerate(overlap_regions):
        if (ra >= re[0] and ra <= re[1] and dec >= re[2] and dec <= re[3] and
        radius <= re[4]):
            #raise Exception("Sorry the region '{0}' does not contain any GLEAM sources".format(overlap_names[i]))
            raise Exception(overlap_err)

    icrs_coord = SkyCoord(ra * u.degree, dec * u.degree, frame='icrs')
    gg = icrs_coord.galactic
    b = float(str(gg.to_string().split(',')[0]).split()[1])
    if (b < 9 and b > -9):
        #raise Exception("Sorry Galactic Plane does not contain any GLEAM sources.")
        raise Exception(overlap_err)
项目:astronomy-utilities    作者:astronomeralex    | 项目源码 | 文件源码
def matching(objra,objdec,ras,decs,boxsize=1):
    """
    objra and objdec are in degrees
    ras and decs are numpy arrays of all the catalog values (also in degrees)
    """
    obj = coord.ICRSCoordinates(ra=objra, dec=objdec, unit=(u.degree, u.degree))
    distances = []
    for i in range(len(ras)):
        if abs(ras[i] - objra) > 0.1 or abs(decs[i] - objdec) > 0.1:
            distances.append(9999)
        else:
            catobj = coord.ICRSCoordinates(ra=ras[i], dec=decs[i], unit=(u.degree, u.degree))
            distances.append(obj.separation(catobj).arcsecs)
    distances = np.array(distances)
    minindex = np.argmin(distances)
    mindist = np.amin(distances)
    b = distances < boxsize
    boxnum = len(distances[b])
    return [minindex,mindist,boxnum]
项目:Panacea    作者:grzeimann    | 项目源码 | 文件源码
def match_to_database(source_list, image_list, cat, Ast, imscale, thresh=8.):
    '''
    RA, Decdetection catalogs and vizier (astroquery) match?  vo conesearch?    
    '''
    matches = []
    for sources, image in zip(source_list, image_list):
        ifuslot = sources[1]
        Ast.get_ifuslot_projection(ifuslot, imscale, image.shape[1]/2.,
                                       image.shape[0]/2.)
        for source in sources[0]:
            ra, dec = Ast.tp_ifuslot.wcs.wcs_pix2world(source['xcentroid'], 
                                                       source['ycentroid'],1)
            c = SkyCoord(ra, dec, unit=(unit.degree, unit.degree))
            idx, d2d, d3d = match_coordinates_sky(c, cat, nthneighbor=1) 
            if d2d.arcsec[0] < thresh:
                dra =  cat.ra[idx].deg - float(ra)
                ddec = cat.dec[idx].deg - float(dec)
                matches.append([int(ifuslot),int(idx), 
                                float(ra), float(dec), 
                                cat.ra[idx].deg, 
                                cat.dec[idx].deg, dra, ddec,
                                d2d.arcsec[0]])
    return matches
项目:GALEX    作者:rahul-aedula95    | 项目源码 | 文件源码
def xloop(i):
    c = SkyCoord(ra=df2['alpha_j2000'][i]*u.degree, dec=df2['delta_j2000'][i]*u.degree)
    #print i
    val = c.cartesian.x
    return float(val)
项目:GALEX    作者:rahul-aedula95    | 项目源码 | 文件源码
def zloop(i):
    c = SkyCoord(ra=df2['alpha_j2000'][i]*u.degree, dec=df2['delta_j2000'][i]*u.degree)
    #print i
    val = c.cartesian.z
    return float(val)


    #print val
    #print df2['mmm'][i]
项目:GALEX    作者:rahul-aedula95    | 项目源码 | 文件源码
def yloop(i):
    c = SkyCoord(ra=df2['alpha_j2000'][i]*u.degree, dec=df2['delta_j2000'][i]*u.degree)
    #print i
    val = c.cartesian.y
    return float(val)
项目:CTAtools    作者:davidsanchez    | 项目源码 | 文件源码
def SetRADEC(self,RA,DEC):
        c_icrs = CH.CoordinatesHandler(RA * u.degree, DEC * u.degree,ICRS)
        self.config["target"]['ra'] = c_icrs.X.degree
        self.config["target"]['dec'] =c_icrs.Y.degree
        self.config["target"]['l'] =c_icrs.skycoord.galactic.l.value
        self.config["target"]['b'] =c_icrs.skycoord.galactic.b.value
        self._set_center()
项目:CTAtools    作者:davidsanchez    | 项目源码 | 文件源码
def SetLB(self,L,B):
        c_gal = CH.CoordinatesHandler(L * u.degree, B * u.degree,Galactic)
        self.config["target"]['ra'] = c_gal.skycoord.icrs.ra.value
        self.config["target"]['dec'] = c_gal.skycoord.icrs.dec.value
        self.config["target"]['l'] =c_gal.X.degree
        self.config["target"]['b'] =c_gal.Y.degree
        self._set_center()
项目:VLTPF    作者:avigan    | 项目源码 | 文件源码
def parallatic_angle(ha, dec, geolat):
    '''
    Parallactic angle of a source in degrees

    Parameters
    ----------
    ha : array_like
        Hour angle, in hours

    dec : float
        Declination, in degrees

    geolat : float
        Observatory declination, in degrees

    Returns
    -------
    pa : array_like
        Parallactic angle values
    '''
    pa = -np.arctan2(-np.sin(ha),
                     np.cos(dec) * np.tan(geolat) - np.sin(dec) * np.cos(ha))

    if (dec >= geolat):
        pa[ha < 0] += 360*units.degree

    return np.degrees(pa)
项目:astrobase    作者:waqasbhatti    | 项目源码 | 文件源码
def query_radecl(ra,
                 decl,
                 filtersystem='sloan_2mass',
                 field_deg2=1.0,
                 usebinaries=True,
                 extinction_sigma=0.1,
                 magnitude_limit=26.0,
                 maglim_filtercol=4,
                 trilegal_version=1.6,
                 extraparams=None,
                 forcefetch=False,
                 cachedir='~/.astrobase/trilegal-cache',
                 verbose=True,
                 timeout=60.0,
                 refresh=150.0,
                 maxtimeout=700.0):
    '''
    This runs the TRILEGAL query for decimal equatorial coordinates.

    '''

    # convert the ra/decl to gl, gb
    radecl = SkyCoord(ra=ra*u.degree, dec=decl*u.degree)

    gl = radecl.galactic.l.degree
    gb = radecl.galactic.b.degree

    return query_galcoords(gl,
                           gb,
                           filtersystem=filtersystem,
                           field_deg2=field_deg2,
                           usebinaries=usebinaries,
                           extinction_sigma=extinction_sigma,
                           magnitude_limit=magnitude_limit,
                           maglim_filtercol=maglim_filtercol,
                           trilegal_version=trilegal_version,
                           extraparams=extraparams,
                           forcefetch=forcefetch,
                           cachedir=cachedir,
                           verbose=verbose,
                           timeout=timeout,
                           refresh=refresh,
                           maxtimeout=maxtimeout)
项目:gaia_tools    作者:jobovy    | 项目源码 | 文件源码
def xmatch(cat1,cat2,maxdist=2,
           colRA1='RA',colDec1='DEC',epoch1=2000.,
           colRA2='RA',colDec2='DEC',epoch2=2000.,
           colpmRA2='pmra',colpmDec2='pmdec',
           swap=False):
    """
    NAME:
       xmatch
    PURPOSE:
       cross-match two catalogs (incl. proper motion in cat2 if epochs are different)
    INPUT:
       cat1 - First catalog
       cat2 - Second catalog
       maxdist= (2) maximum distance in arcsec
       colRA1= ('RA') name of the tag in cat1 with the right ascension in degree in cat1 (assumed to be ICRS)
       colDec1= ('DEC') name of the tag in cat1 with the declination in degree in cat1 (assumed to be ICRS)
       epoch1= (2000.) epoch of the coordinates in cat1
       colRA2= ('RA') name of the tag in cat2 with the right ascension in degree in cat2 (assumed to be ICRS)
       colDec2= ('DEC') name of the tag in cat2 with the declination in degree in cat2 (assumed to be ICRS)
       epoch2= (2000.) epoch of the coordinates in cat2
       colpmRA2= ('pmra') name of the tag in cat2 with the proper motion in right ascension in degree in cat2 (assumed to be ICRS; includes cos(Dec)) [only used when epochs are different]
       colpmDec2= ('pmdec') name of the tag in cat2 with the proper motion in declination in degree in cat2 (assumed to be ICRS) [only used when epochs are different]
       swap= (False) if False, find closest matches in cat2 for each cat1 source, if False do the opposite (important when one of the catalogs has duplicates)
    OUTPUT:
       (index into cat1 of matching objects,
        index into cat2 of matching objects,
        angular separation between matching objects)
    HISTORY:
       2016-09-12 - Written - Bovy (UofT)
       2016-09-21 - Account for Gaia epoch 2015 - Bovy (UofT)
    """
    if ('ref_epoch' in cat1.dtype.fields and numpy.fabs(epoch1-2015.) > 0.01)\
            or ('ref_epoch' in cat2.dtype.fields and \
                    numpy.fabs(epoch2-2015.) > 0.01):
        warnings.warn("You appear to be using a Gaia catalog, but are not setting the epoch to 2015., which may lead to incorrect matches")
    depoch= epoch2-epoch1
    if depoch != 0.:
        # Use proper motion to get both catalogs at the same time
        dra=cat2[colpmRA2]/numpy.cos(cat2[colDec2]/180.*numpy.pi)\
            /3600000.*depoch
        ddec= cat2[colpmDec2]/3600000.*depoch
    else:
        dra= 0.
        ddec= 0.
    mc1= acoords.SkyCoord(cat1[colRA1],cat1[colDec1],
                          unit=(u.degree, u.degree),frame='icrs')
    mc2= acoords.SkyCoord(cat2[colRA2]-dra,cat2[colDec2]-ddec,
                          unit=(u.degree, u.degree),frame='icrs')
    if swap:
        idx,d2d,d3d = mc2.match_to_catalog_sky(mc1)
        m1= numpy.arange(len(cat2))
    else:
        idx,d2d,d3d = mc1.match_to_catalog_sky(mc2)
        m1= numpy.arange(len(cat1))
    mindx= d2d < maxdist*u.arcsec
    m1= m1[mindx]
    m2= idx[mindx]
    if swap:
        return (m2,m1,d2d[mindx])
    else:
        return (m1,m2,d2d[mindx])
项目:VLTPF    作者:avigan    | 项目源码 | 文件源码
def compute_times(frames_info):
    '''
    Compute the various timestamps associated to frames

    Parameters
    ----------
    frames_info : dataframe
        The data frame with all the information on science frames
    '''

    # get necessary values
    time_start = frames_info['DATE-OBS'].values
    time_end   = frames_info['DET FRAM UTC'].values
    time_delta = (time_end - time_start) / frames_info['DET NDIT'].values.astype(np.int)
    DIT        = np.array(frames_info['DET SEQ1 DIT'].values.astype(np.float)*1000, dtype='timedelta64[ms]')

    # calculate UTC time stamps
    idx = frames_info.index.get_level_values(1).values
    ts_start = time_start + time_delta * idx
    ts       = time_start + time_delta * idx + DIT/2
    ts_end   = time_start + time_delta * idx + DIT

    # calculate mjd
    geolon = coord.Angle(frames_info['TEL GEOLON'].values[0], units.degree)
    geolat = coord.Angle(frames_info['TEL GEOLAT'].values[0], units.degree)
    geoelev = frames_info['TEL GEOELEV'].values[0]

    utc = Time(ts_start.astype(str), scale='utc', location=(geolon, geolat, geoelev))
    mjd_start = utc.mjd

    utc = Time(ts.astype(str), scale='utc', location=(geolon, geolat, geoelev))
    mjd = utc.mjd

    utc = Time(ts_end.astype(str), scale='utc', location=(geolon, geolat, geoelev))
    mjd_end = utc.mjd

    # update frames_info
    frames_info['TIME START'] = ts_start
    frames_info['TIME']       = ts
    frames_info['TIME END']   = ts_end

    frames_info['MJD START']  = mjd_start
    frames_info['MJD']        = mjd
    frames_info['MJD END']    = mjd_end
项目:CAAPR    作者:Stargrazer82301    | 项目源码 | 文件源码
def load_fits_file(self, msg):
        filename = msg
        if isinstance(filename, str) or isinstance(filename, unicode):
            if filename.lower().endswith('.fits') or filename.lower().endswith('.fits.gz'):
                if os.path.isfile(filename):
                    # TODO: be more flexible about hdulist where image data is NOT just [0].data
                    # TODO also, in case of extended fits files need to deal with additional header info
                    # following try/except handles situation when autoloading files tries to autoload a file 
                    #     before it's been fully written to disk.
                    max_n_tries = 5
                    pause_time_between_tries_sec = 1.
                    cur_try = 0
                    not_yet_successful = True
                    while (cur_try < max_n_tries) and not_yet_successful:
                        try:
                            self.cur_fits_hdulist = self.load_hdulist_from_fitsfile(filename)
                            self.load_numpy_array(self.cur_fits_hdulist[0].data, is_fits_file=True)
                            not_yet_successful = False
                        except:  # I've only seen ValueError, but might as well catch for all errors and re-try
                            time.sleep(pause_time_between_tries_sec)
                        cur_try += 1
                    self.cur_fitsfile_basename = os.path.basename(filename)
                    self.cur_fitsfile_path = os.path.abspath(os.path.dirname(filename))
                    self.set_window_title()
                    if (hasattr(self.primary_image_panel, 'cur_fits_header_dialog') and 
                        self.primary_image_panel.cur_fits_header_dialog.is_dialog_still_open):
                        raw_header_str = self.cur_fits_hdulist[0].header.tostring()
                        header_str = (('\n'.join([raw_header_str[i:i+80] for i in np.arange(0, len(raw_header_str), 80)
                                                  if raw_header_str[i:i+80] != " "*80])) + '\n')
                        self.primary_image_panel.cur_fits_header_dialog.SetTitle(self.cur_fitsfile_basename)
                        self.primary_image_panel.cur_fits_header_dialog.text.SetValue(header_str)
                        self.primary_image_panel.cur_fits_header_dialog.last_find_index = 0
                        self.primary_image_panel.cur_fits_header_dialog.on_search(None)
                    # TODO: better error handling for if WCS not available or partially available
                    try:
                        w = wcs.WCS(self.cur_fits_hdulist[0].header)
                        # TODO: (urgent) need to check ones/arange in following, do I have this reversed?
                        a = w.all_pix2world(
                                  np.outer(np.ones(self.raw_image.shape[-2]), 
                                           np.arange(self.raw_image.shape[-1])),
                                  np.outer(np.arange(self.raw_image.shape[-2]), 
                                           np.ones(self.raw_image.shape[-1])),
                                  0)
                        self.image_radec = ICRS(a[0]*units.degree, a[1]*units.degree)
                    except:  # just ignore radec if anything at all goes wrong.
                        self.image_radec = None
                    wx.CallAfter(pub.sendMessage, 'fitsfile-loaded', msg=filename)
                else:
                    raise Error("Cannot find file: {}".format(filename))
            else:
                raise Error("Requested filename ({}) does not end with .fits, .fits.gz, " +
                            "or other capitalization of those".format(filename))
        else:
            raise Error("load_fits_file requires string input, not type: {}".format(type(filename)))
项目:CAAPR    作者:Stargrazer82301    | 项目源码 | 文件源码
def load_fits_file(self, msg):
        filename = msg
        if isinstance(filename, str) or isinstance(filename, unicode):
            if filename.lower().endswith('.fits') or filename.lower().endswith('.fits.gz'):
                if os.path.isfile(filename):
                    # TODO: be more flexible about hdulist where image data is NOT just [0].data
                    # TODO also, in case of extended fits files need to deal with additional header info
                    # following try/except handles situation when autoloading files tries to autoload a file 
                    #     before it's been fully written to disk.
                    max_n_tries = 5
                    pause_time_between_tries_sec = 1.
                    cur_try = 0
                    not_yet_successful = True
                    while (cur_try < max_n_tries) and not_yet_successful:
                        try:
                            self.cur_fits_hdulist = self.load_hdulist_from_fitsfile(filename)
                            self.load_numpy_array(self.cur_fits_hdulist[0].data, is_fits_file=True)
                            not_yet_successful = False
                        except:  # I've only seen ValueError, but might as well catch for all errors and re-try
                            time.sleep(pause_time_between_tries_sec)
                        cur_try += 1
                    self.cur_fitsfile_basename = os.path.basename(filename)
                    self.cur_fitsfile_path = os.path.abspath(os.path.dirname(filename))
                    self.set_window_title()
                    if (hasattr(self.primary_image_panel, 'cur_fits_header_dialog') and 
                        self.primary_image_panel.cur_fits_header_dialog.is_dialog_still_open):
                        raw_header_str = self.cur_fits_hdulist[0].header.tostring()
                        header_str = (('\n'.join([raw_header_str[i:i+80] for i in np.arange(0, len(raw_header_str), 80)
                                                  if raw_header_str[i:i+80] != " "*80])) + '\n')
                        self.primary_image_panel.cur_fits_header_dialog.SetTitle(self.cur_fitsfile_basename)
                        self.primary_image_panel.cur_fits_header_dialog.text.SetValue(header_str)
                        self.primary_image_panel.cur_fits_header_dialog.last_find_index = 0
                        self.primary_image_panel.cur_fits_header_dialog.on_search(None)
                    # TODO: better error handling for if WCS not available or partially available
                    try:
                        w = wcs.WCS(self.cur_fits_hdulist[0].header)
                        # TODO: (urgent) need to check ones/arange in following, do I have this reversed?
                        a = w.all_pix2world(
                                  np.outer(np.ones(self.raw_image.shape[-2]), 
                                           np.arange(self.raw_image.shape[-1])),
                                  np.outer(np.arange(self.raw_image.shape[-2]), 
                                           np.ones(self.raw_image.shape[-1])),
                                  0)
                        self.image_radec = ICRS(a[0]*units.degree, a[1]*units.degree)
                    except:  # just ignore radec if anything at all goes wrong.
                        self.image_radec = None
                    wx.CallAfter(pub.sendMessage, 'fitsfile-loaded', msg=filename)
                else:
                    raise Error("Cannot find file: {}".format(filename))
            else:
                raise Error("Requested filename ({}) does not end with .fits, .fits.gz, " +
                            "or other capitalization of those".format(filename))
        else:
            raise Error("load_fits_file requires string input, not type: {}".format(type(filename)))
项目:DR1_analysis    作者:GBTAmmoniaSurvey    | 项目源码 | 文件源码
def plot_dust_overlay(nh3_image_fits,h2_image_fits,region,plot_param,v_min,v_max,maskLim,obsMaskFits):
    text_size = 14
    b18_text_size = 20   
    # Contour parameters (currently NH3 moment 0)
    cont_color='black'
    cont_lw   = 0.6
    cont_levs=2**np.arange( 0,20)*plot_param['w11_step']
    # Masking of small (noisy) regions
    selem = np.array([[0,1,0],[1,1,1],[0,1,0]])
    LowestContour = cont_levs[0]*0.5
    w11_hdu = fits.open(nh3_image_fits)
    map = w11_hdu[0].data
    mask = binary_opening(map > LowestContour, selem)
    MaskedMap = mask*map
    w11_hdu[0].data = MaskedMap
    # Labels
    if region == 'B18':
        label_colour = 'white'
        text_size = b18_text_size
    else:
        label_colour = 'white'
    fig=aplpy.FITSFigure(h2_image_fits,figsize=(plot_param['size_x'], plot_param['size_y']))
    fig.show_colorscale(cmap='hot',vmin=v_min,vmax=v_max,stretch='log',vmid=v_min-v_min*plot_param['vmid_scale'])
    fig.set_nan_color('0.95')
    # Observations mask contour
    fig.show_contour(obsMaskFits,colors='white',levels=1,linewidths=1.5)
    # NH3 moment contours
    fig.show_contour(w11_hdu,colors=cont_color,levels=cont_levs,linewidths=cont_lw)
    fig.axis_labels.set_font(family='sans_serif',size=text_size)
    # Ticks
    fig.tick_labels.set_font(family='sans_serif',size=text_size)
    fig.ticks.set_color('white')
    fig.tick_labels.set_xformat('hh:mm:ss')
    fig.tick_labels.set_style('colons')
    fig.tick_labels.set_yformat('dd:mm')
    # Scale bar
    # magic line of code to obtain scale in arcsec obtained from 
    # http://www.astropy.org/astropy-tutorials/Quantities.html
    ang_sep = (plot_param['scalebar_size'].to(u.au)/plot_param['distance']).to(u.arcsec, equivalencies=u.dimensionless_angles())
    fig.add_scalebar(ang_sep.to(u.degree))
    fig.scalebar.set_font(family='sans_serif',size=text_size)
    fig.scalebar.set_corner(plot_param['scalebar_pos'])
    fig.scalebar.set(color='white')
    fig.scalebar.set_label('{0:4.2f}'.format(plot_param['scalebar_size']))
    fig.add_label(plot_param['label_xpos'], plot_param['label_ypos'], 
                  '{0}\n{1}'.format(region,'500 $\mu$m'), 
                  relative=True, color=label_colour, 
                  horizontalalignment=plot_param['label_align'],
                  family='sans_serif',size=text_size)

    fig.save( 'figures/{0}_continuum_image.pdf'.format(region),adjust_bbox=True,dpi=200)#, bbox_inches='tight')
    fig.close()
项目:DR1_analysis    作者:GBTAmmoniaSurvey    | 项目源码 | 文件源码
def plot_abundance(nh3_cont_fits,nh3_col_hdu,h2_col_hdu,region,plot_pars,maskLim,obsMaskFits):
    text_size = 14
    b18_text_size = 20
    if region == 'B18':
        text_size = b18_text_size
    # Get protostellar locations
    ra_prot, de_prot = get_prot_loc(region)
    # Contour parameters (currently NH3 moment 0)
    cont_color='0.6'
    cont_lw   = 0.6
    cont_levs=2**np.arange( 0,20)*plot_param['w11_step']
    # Calculate abundance
    log_xnh3 = nh3_col_hdu[0].data - np.log10(h2_col_hdu.data)
    log_xnh3_hdu = fits.PrimaryHDU(log_xnh3,nh3_col_hdu[0].header)
    log_xnh3_hdu.writeto('../testing/{0}/parameterMaps/{0}_XNH3_{1}.fits'.format(region,file_extension),clobber=True)
    fig=aplpy.FITSFigure(log_xnh3_hdu,figsize=(plot_param['size_x'], plot_param['size_y']))
    fig.show_colorscale(cmap='YlOrRd_r',vmin=plot_param['xnh3_lim'][0],vmax=plot_param['xnh3_lim'][1])
    #fig.set_nan_color('0.95')
    # Observations mask contour
    fig.show_contour(obsMaskFits,colors='white',levels=1,linewidths=1.5)
    # NH3 moment contours
    # Masking of small (noisy) regions
    selem = np.array([[0,1,0],[1,1,1],[0,1,0]])
    LowestContour = cont_levs[0]*0.5
    w11_hdu = fits.open(nh3_cont_fits)
    map = w11_hdu[0].data
    mask = binary_opening(map > LowestContour, selem)
    MaskedMap = mask*map
    w11_hdu[0].data = MaskedMap
    fig.show_contour(w11_hdu,colors=cont_color,levels=cont_levs,linewidths=cont_lw)
    # Ticks
    fig.ticks.set_color('black')
    fig.tick_labels.set_font(family='sans_serif',size=text_size)
    fig.tick_labels.set_xformat('hh:mm:ss')
    fig.tick_labels.set_style('colons')
    fig.tick_labels.set_yformat('dd:mm')
    # Scale bar
    ang_sep = (plot_param['scalebar_size'].to(u.au)/plot_param['distance']).to(u.arcsec, equivalencies=u.dimensionless_angles())
    fig.add_colorbar()
    fig.colorbar.show(box_orientation='horizontal', width=0.1, pad=0.0, location='top',
                      ticks=[-10,-9.5,-9,-8.5,-8,-7.5,-7,-6.5])
    fig.colorbar.set_font(family='sans_serif',size=text_size)
    fig.add_scalebar(ang_sep.to(u.degree))
    fig.scalebar.set_font(family='sans_serif',size=text_size)
    fig.scalebar.set_corner(plot_param['scalebar_pos'])
    fig.scalebar.set(color='black')
    fig.scalebar.set_label('{0:4.2f}'.format(plot_param['scalebar_size']))
    label_colour = 'black'
    fig.add_label(plot_param['label_xpos'], plot_param['label_ypos'], 
                  '{0}\n{1}'.format(region,r'$\mathrm{log} \ X(\mathrm{NH}_3)$'), 
                  relative=True, color=label_colour, 
                  horizontalalignment=plot_param['label_align'],
                  family='sans_serif',size=text_size)
    fig.save( 'figures/{0}_xnh3_image.pdf'.format(region),adjust_bbox=True,dpi=200)#, bbox_inches='tight')
    # Add protostars
    fig.show_markers(ra_prot,de_prot,marker='*',s=50,
                     c='white',edgecolors='black',linewidth=0.5,zorder=4)
    fig.save( 'figures/{0}_xnh3_image_prot.pdf'.format(region),adjust_bbox=True,dpi=200)
    fig.close()