def create_artists(self, legend, orig_handle, xdescent, ydescent, width, height, fontsize, trans): x_tail = xdescent x_head = xdescent + width # Three units to align the arrow to the center relative to the label y_head = 3 y_tail = 3 # Get original colors of the quiver key color = orig_handle.color facecolor = orig_handle.kw.get('facecolor', None) p = FancyArrowPatch((x_tail, y_tail), (x_head, y_head), mutation_scale=8, color=color) p.set_facecolor(color) text = Text(xdescent + width, ydescent, text=orig_handle.label) # Remove the quiver key from the plot orig_handle.remove() return [p, text]
def asteroids_plot(self, image_path=None, ra=None, dec=None, odate=None, time_travel=1, radi=6, max_mag=20.0, circle_color='yellow', arrow_color='red', invert_yaxis="True"): """ Source plot module. @param image_path: data part of the FITS image @type image_path: numpy array @param ra: RA coordinate of target area. @type ra: str in "HH MM SS" @param dec: DEC coordinate of target area @type dec: str in "+DD MM SS" @param radi: Radius in arcmin. @type radi: float @param odate: Ephemeris date of observation in date @type odate: "2017-08-15T19:50:00.95" format in str @param time_travel: Jump into time after given date (in hour). @type time_travel: float @param max_mag: Limit magnitude to be queried object(s) @type max_mag: float @param circle_color: Color of the asteroids marks @type circle_color: str @param arrow_color: Color of the asteroids direction marks @type arrow_color: str @param invert_yaxis: invert y axis or not. @type invert_yaxis: bool @returns: boolean """ from .catalog import Query # filename = get_pkg_data_filename(image_path) rcParams['figure.figsize'] = [10., 8.] # rcParams.update({'font.size': 10}) if image_path: hdu = fits.open(image_path)[0] elif not image_path and ra and dec and odate: co = coordinates.SkyCoord('{0} {1}'.format(ra, dec), unit=(u.hourangle, u.deg), frame='icrs') print('Target Coordinates:', co.to_string(style='hmsdms', sep=':'), 'in {0} arcmin'.format(radi)) try: server_img = SkyView.get_images(position=co, survey=['DSS'], radius=radi * u.arcmin) hdu = server_img[0][0] except Exception as e: print("SkyView could not get the image from DSS server.") print(e) raise SystemExit wcs = WCS(hdu.header) data = hdu.data.astype(float) bkg = sep.Background(data) # bkg_image = bkg.back() # bkg_rms = bkg.rms() data_sub = data - bkg m, s = np.mean(data_sub), np.std(data_sub) ax = plt.subplot(projection=wcs) plt.imshow(data_sub, interpolation='nearest', cmap='gray', vmin=m - s, vmax=m + s, origin='lower') ax.coords.grid(True, color='white', ls='solid') ax.coords[0].set_axislabel('Galactic Longitude') ax.coords[1].set_axislabel('Galactic Latitude') overlay = ax.get_coords_overlay('icrs') overlay.grid(color='white', ls='dotted') overlay[0].set_axislabel('Right Ascension (ICRS)') overlay[1].set_axislabel('Declination (ICRS)') sb = Query() ac = AstCalc() if image_path: fo = FitsOps(image_path) if not odate: odate = fo.get_header('date-obs') else: odate = odate ra_dec = ac.center_finder(image_path, wcs_ref=True) elif not image_path and ra and dec and odate: odate = odate ra_dec = [co.ra, co.dec] request0 = sb.find_skybot_objects(odate, ra_dec[0].degree, ra_dec[1].degree, radius=radi) if request0[0]: asteroids = request0[1] elif request0[0] is False: print(request0[1]) raise SystemExit request1 = sb.find_skybot_objects(odate, ra_dec[0].degree, ra_dec[1].degree, radius=float(radi), time_travel=time_travel) if request1[0]: asteroids_after = request1[1] elif request1[0] is False: print(request1[1]) raise SystemExit for i in range(len(asteroids)): if float(asteroids['m_v'][i]) <= max_mag: c = coordinates.SkyCoord('{0} {1}'.format( asteroids['ra(h)'][i], asteroids['dec(deg)'][i]), unit=(u.hourangle, u.deg), frame='icrs') c_after = coordinates.SkyCoord('{0} {1}'.format( asteroids_after['ra(h)'][i], asteroids_after['dec(deg)'][i]), unit=(u.hourangle, u.deg), frame='icrs') r = FancyArrowPatch((c.ra.degree, c.dec.degree), (c_after.ra.degree, c_after.dec.degree), arrowstyle='->', mutation_scale=10, transform=ax.get_transform('icrs')) p = Circle((c.ra.degree, c.dec.degree), 0.005, edgecolor=circle_color, facecolor='none', transform=ax.get_transform('icrs')) ax.text(c.ra.degree, c.dec.degree - 0.007, asteroids['name'][i], size=12, color='black', ha='center', va='center', transform=ax.get_transform('icrs')) r.set_facecolor('none') r.set_edgecolor(arrow_color) ax.add_patch(p) ax.add_patch(r) # plt.gca().invert_xaxis() if invert_yaxis == "True": plt.gca().invert_yaxis() plt.show() print(asteroids) return True
def asteroids_plot(self, image_path=None, ra=None, dec=None, odate=None, time_travel=1, radi=6, max_mag=20.0, circle_color='yellow', arrow_color='red'): """ Source plot module. @param image_path: data part of the FITS image @type image_path: numpy array @param ra: RA coordinate of target area. @type ra: str in "HH MM SS" @param dec: DEC coordinate of target area @type dec: str in "+DD MM SS" @param radi: Radius in arcmin. @type radi: float @param odate: Ephemeris date of observation in date @type odate: "2017-08-15T19:50:00.95" format in str @param time_travel: Jump into time after given date (in hour). @type time_travel: float @param max_mag: Limit magnitude to be queried object(s) @type max_mag: float @param circle_color: Color of the asteroids marks @type circle_color: str @param arrow_color: Color of the asteroids direction marks @type arrow_color: str @returns: boolean """ from .catalog import Query # filename = get_pkg_data_filename(image_path) rcParams['figure.figsize'] = [15., 12.] # rcParams.update({'font.size': 10}) if image_path: hdu = fits.open(image_path)[0] elif not image_path and ra and dec and odate: co = coordinates.SkyCoord('{0} {1}'.format(ra, dec), unit=(u.hourangle, u.deg), frame='icrs') print('Target Coordinates:', co.to_string(style='hmsdms', sep=':'), 'in {0} arcmin'.format(radi)) try: server_img = SkyView.get_images(position=co, survey=['DSS'], radius=radi * u.arcmin) hdu = server_img[0][0] except Exception as e: print("SkyView could not get the image from DSS server.") print(e) raise SystemExit wcs = WCS(hdu.header) data = hdu.data.astype(float) bkg = sep.Background(data) # bkg_image = bkg.back() # bkg_rms = bkg.rms() data_sub = data - bkg m, s = np.mean(data_sub), np.std(data_sub) ax = plt.subplot(projection=wcs) plt.imshow(data_sub, interpolation='nearest', cmap='gray', vmin=m - s, vmax=m + s, origin='lower') ax.coords.grid(True, color='white', ls='solid') ax.coords[0].set_axislabel('Galactic Longitude') ax.coords[1].set_axislabel('Galactic Latitude') overlay = ax.get_coords_overlay('icrs') overlay.grid(color='white', ls='dotted') overlay[0].set_axislabel('Right Ascension (ICRS)') overlay[1].set_axislabel('Declination (ICRS)') sb = Query() ac = AstCalc() if image_path: fo = FitsOps(image_path) if not odate: odate = fo.get_header('date-obs') else: odate = odate ra_dec = ac.center_finder(image_path, wcs_ref=True) elif not image_path and ra and dec and odate: odate = odate ra_dec = [co.ra, co.dec] request0 = sb.find_skybot_objects(odate, ra_dec[0].degree, ra_dec[1].degree, radius=radi) if request0[0]: asteroids = request0[1] elif request0[0] is False: print(request0[1]) raise SystemExit request1 = sb.find_skybot_objects(odate, ra_dec[0].degree, ra_dec[1].degree, radius=float(radi), time_travel=time_travel) if request1[0]: asteroids_after = request1[1] elif request1[0] is False: print(request1[1]) raise SystemExit for i in range(len(asteroids)): if float(asteroids['m_v'][i]) <= max_mag: c = coordinates.SkyCoord('{0} {1}'.format( asteroids['ra(h)'][i], asteroids['dec(deg)'][i]), unit=(u.hourangle, u.deg), frame='icrs') c_after = coordinates.SkyCoord('{0} {1}'.format( asteroids_after['ra(h)'][i], asteroids_after['dec(deg)'][i]), unit=(u.hourangle, u.deg), frame='icrs') r = FancyArrowPatch( (c.ra.degree, c.dec.degree), (c_after.ra.degree, c_after.dec.degree), arrowstyle='->', mutation_scale=10, transform=ax.get_transform('icrs')) p = Circle((c.ra.degree, c.dec.degree), 0.005, edgecolor=circle_color, facecolor='none', transform=ax.get_transform('icrs')) ax.text(c.ra.degree, c.dec.degree - 0.007, asteroids['name'][i], size=12, color='black', ha='center', va='center', transform=ax.get_transform('icrs')) r.set_facecolor('none') r.set_edgecolor(arrow_color) ax.add_patch(p) ax.add_patch(r) # plt.gca().invert_xaxis() plt.gca().invert_yaxis() plt.show() print(asteroids) return True