def draw_limb(self, axes=None, **kwargs): """Draws a circle representing the solar limb Parameters ---------- axes: matplotlib.axes object or None Axes to plot limb on or None to use current axes. Returns ------- circ: list A list containing the `matplotlib.patches.Circle` object that has been added to the axes. Notes ----- keyword arguments are passed onto the Circle Patch, see: http://matplotlib.org/api/artist_api.html#matplotlib.patches.Patch http://matplotlib.org/api/artist_api.html#matplotlib.patches.Circle """ if not axes: axes = wcsaxes_compat.gca_wcs(self.wcs) transform = wcsaxes_compat.get_world_transform(axes) if wcsaxes_compat.is_wcsaxes(axes): radius = self.rsun_obs.to(u.deg).value else: radius = self.rsun_obs.value c_kw = {'radius':radius, 'fill':False, 'color':'white', 'zorder':100, 'transform': transform } c_kw.update(kwargs) circ = patches.Circle([0, 0], **c_kw) axes.add_artist(circ) return [circ]
def draw_grid(self, axes=None, grid_spacing=15*u.deg, **kwargs): """Draws a grid over the surface of the Sun Parameters ---------- axes: matplotlib.axes object or None Axes to plot limb on or None to use current axes. grid_spacing: float Spacing (in degrees) for longitude and latitude grid. Returns ------- lines: list A list of `matplotlib.lines.Line2D` objects that have been plotted. Notes ----- keyword arguments are passed onto matplotlib.pyplot.plot """ if not axes: axes = wcsaxes_compat.gca_wcs(self.wcs) lines = [] # Do not automatically rescale axes when plotting the overlay axes.set_autoscale_on(False) transform = wcsaxes_compat.get_world_transform(axes) XX, YY = np.meshgrid(np.arange(self.data.shape[0]), np.arange(self.data.shape[1])) x, y = self.pixel_to_data(XX*u.pix, YY*u.pix) dsun = self.dsun b0 = self.heliographic_latitude.to(u.deg).value l0 = self.heliographic_longitude.to(u.deg).value units = self.units #Prep the plot kwargs plot_kw = {'color':'white', 'linestyle':'dotted', 'zorder':100, 'transform':transform} plot_kw.update(kwargs) hg_longitude_deg = np.linspace(-180, 180, num=361) + l0 hg_latitude_deg = np.arange(-90, 90, grid_spacing.to(u.deg).value) # draw the latitude lines for lat in hg_latitude_deg: x, y = wcs.convert_hg_hpc(hg_longitude_deg, lat * np.ones(361), b0_deg=b0, l0_deg=l0, dsun_meters=dsun, angle_units=units.x, occultation=True) valid = np.logical_and(np.isfinite(x), np.isfinite(y)) x = x[valid] y = y[valid] if wcsaxes_compat.is_wcsaxes(axes): x = (x*u.arcsec).to(u.deg).value y = (y*u.arcsec).to(u.deg).value lines += axes.plot(x, y, **plot_kw) hg_longitude_deg = np.arange(-180, 180, grid_spacing.to(u.deg).value) + l0 hg_latitude_deg = np.linspace(-90, 90, num=181) # draw the longitude lines for lon in hg_longitude_deg: x, y = wcs.convert_hg_hpc(lon * np.ones(181), hg_latitude_deg, b0_deg=b0, l0_deg=l0, dsun_meters=dsun, angle_units=units[0], occultation=True) valid = np.logical_and(np.isfinite(x), np.isfinite(y)) x = x[valid] y = y[valid] if wcsaxes_compat.is_wcsaxes(axes): x = (x*u.arcsec).to(u.deg).value y = (y*u.arcsec).to(u.deg).value lines += axes.plot(x, y, **plot_kw) # Turn autoscaling back on. axes.set_autoscale_on(True) return lines