def curvelinear_test2(fig, rect=111): """ Polar projection, but in a rectangular box. """ # see demo_curvelinear_grid.py for details tr = Affine2D().translate(0, 90) + Affine2D().scale(np.pi / 180., 1.) + \ PolarAxes.PolarTransform() extreme_finder = angle_helper.ExtremeFinderCycle( 10, 60, lon_cycle=360, lat_cycle=None, lon_minmax=None, lat_minmax=(-90, np.inf), ) # Changes theta gridline count grid_locator1 = angle_helper.LocatorHMS(12) grid_locator2 = angle_helper.LocatorDMS(6) tick_formatter1 = angle_helper.FormatterHMS() tick_formatter2 = angle_helper.FormatterDMS() grid_helper = GridHelperCurveLinear(tr, extreme_finder=extreme_finder, grid_locator1=grid_locator1, grid_locator2=grid_locator2, tick_formatter1=tick_formatter1, tick_formatter2=tick_formatter2) ax1 = SubplotHost(fig, rect, grid_helper=grid_helper) # make ticklabels of right and top axis visible. ax1.axis["right"].major_ticklabels.set_visible(True) ax1.axis["top"].major_ticklabels.set_visible(True) ax1.axis["bottom"].major_ticklabels.set_visible(True) # let right and bottom axis show ticklabels for 1st coordinate (angle) ax1.axis["right"].get_helper().nth_coord_ticks = 0 ax1.axis["bottom"].get_helper().nth_coord_ticks = 0 # fig.add_subplot(ax1) grid_helper = ax1.get_grid_helper() # You may or may not need these - they set the view window explicitly # rather than using the default as determined by matplotlib with extreme # finder. ax1.set_aspect(1.) ax1.set_xlim(-4, 25) # moves the origin left-right in ax1 ax1.set_ylim(-2.5, 30) # moves the origin up-down ax1.set_ylabel('$DEC\,(^{\circ})$') ax1.set_xlabel('$RA\,(h)$') ax1.grid(True) # ax1.grid(linestyle='--', which='x') # either keyword applies to both # ax1.grid(linestyle=':', which='y') # sets of gridlines return ax1, tr
def curvelinear_test2(fig, gs=None, xcenter=0.0, ycenter=17.3, xwidth=1.5, ywidth=1.5, rot_angle=0.0, xlabel=xlabel, ylabel=ylabel, xgrid_density=8, ygrid_density=5): """ polar projection, but in a rectangular box. """ tr = Affine2D().translate(0,90) tr += Affine2D().scale(np.pi/180., 1.) tr += PolarAxes.PolarTransform() tr += Affine2D().rotate(rot_angle) # This rotates the grid extreme_finder = angle_helper.ExtremeFinderCycle(10, 60, lon_cycle = 360, lat_cycle = None, lon_minmax = None, lat_minmax = (-90, np.inf), ) grid_locator1 = angle_helper.LocatorHMS(xgrid_density) #changes theta gridline count tick_formatter1 = angle_helper.FormatterHMS() grid_locator2 = angle_helper.LocatorDMS(ygrid_density) #changes theta gridline count tick_formatter2 = angle_helper.FormatterDMS() grid_helper = GridHelperCurveLinear(tr, extreme_finder=extreme_finder, grid_locator1=grid_locator1, grid_locator2=grid_locator2, tick_formatter1=tick_formatter1, tick_formatter2=tick_formatter2 ) # ax1 = SubplotHost(fig, rect, grid_helper=grid_helper) if gs is None: ax1 = SubplotHost(fig, 111, grid_helper=grid_helper) else: ax1 = SubplotHost(fig, gs, grid_helper=grid_helper) # make ticklabels of right and top axis visible. ax1.axis["right"].major_ticklabels.set_visible(False) ax1.axis["top"].major_ticklabels.set_visible(False) ax1.axis["bottom"].major_ticklabels.set_visible(True) #Turn off? # let right and bottom axis show ticklabels for 1st coordinate (angle) ax1.axis["right"].get_helper().nth_coord_ticks=0 ax1.axis["bottom"].get_helper().nth_coord_ticks=0 fig.add_subplot(ax1) grid_helper = ax1.get_grid_helper() # These move the grid ax1.set_xlim(xcenter-xwidth, xcenter+xwidth) # moves the origin left-right in ax1 ax1.set_ylim(ycenter-ywidth, ycenter+ywidth) # moves the origin up-down if xlabel is not None: ax1.set_xlabel(xlabel) if ylabel is not None: ax1.set_ylabel(ylabel) ax1.grid(True, linestyle='-') return ax1,tr
def make_mw_plot(fig=None, mw_img_name = "Milky_Way_2005.jpg", solar_rad=8.5, fignum=5): """ Generate a "Milky Way" plot with Robert Hurt's Milky Way illustration as the background. .. TODO: Figure out how to fix the axis labels. They don't work now! Parameters ---------- fig : matplotlib.figure instance If you want to start with a figure instance, can specify it mw_img_name: str The name of the image on disk solar_rad : float The assumed Galactocentric orbital radius of the sun fignum : int If Figure not specified, use this figure number """ # load image mw = np.array(PIL.Image.open(mw_img_name))[:,::-1] # set some constants npix = mw.shape[0] # must be symmetric # Galactic Center in middle of image gc_loc = [x/2 for x in mw.shape] # Sun is at 0.691 (maybe really 0.7?) length of image sun_loc = mw.shape[0]/2,int(mw.shape[1]*0.691) # determine scaling kpc_per_pix = solar_rad / (sun_loc[1]-gc_loc[1]) boxsize = npix*kpc_per_pix # most of the code below is taken from: # http://matplotlib.sourceforge.net/examples/axes_grid/demo_curvelinear_grid.html # and http://matplotlib.sourceforge.net/examples/axes_grid/demo_floating_axis.html if fig is None: fig = plt.figure(fignum) plt.clf() # PolarAxes.PolarTransform takes radian. However, we want our coordinate # system in degree # this defines the polar coordinate system @ Galactic center tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() # polar projection, which involves cycle, and also has limits in # its coordinates, needs a special method to find the extremes # (min, max of the coordinate within the view). # grid helper stuff, I think (grid is off by default) # This may not apply to the image *at all*, but would if you # used the grid # 40, 40 : number of sampling points along x, y direction extreme_finder = angle_helper.ExtremeFinderCycle(40, 40, lon_cycle = 360, lat_cycle = None, lon_minmax = None, lat_minmax = (0, np.inf), ) grid_locator1 = angle_helper.LocatorDMS(12) # Find a grid values appropriate for the coordinate (degree, # minute, second). tick_formatter1 = angle_helper.FormatterDMS() # And also uses an appropriate formatter. Note that,the # acceptable Locator and Formatter class is a bit different than # that of mpl's, and you cannot directly use mpl's Locator and # Formatter here (but may be possible in the future). grid_helper = GridHelperCurveLinear(tr, extreme_finder=extreme_finder, grid_locator1=grid_locator1, tick_formatter1=tick_formatter1, #tick_formatter2=matplotlib.ticker.FuncFormatter(lambda x: x * kpc_per_pix) ) ax = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper, axisbg='#333333') fig.add_subplot(ax) # ax.transData is still a (rectlinear) pixel coordinate. Only the # grids are done in galactocentric coordinate. # show the image ax.imshow(mw,extent=[-boxsize/2,boxsize/2,-boxsize/2,boxsize/2]) ax_pixgrid = ax.twin() # simple twin will give you a twin axes, # but with normal grids. # to draw heliocentric grids, it is best to update the grid_helper # with new transform. # need to rotate by -90 deg to get into the standard convention tr_helio = Affine2D().scale(np.pi/180., 1.).translate(-np.pi/2.,0) + \ PolarAxes.PolarTransform() + \ Affine2D().translate(0,solar_rad) # Note that the transform is from the heliocentric coordinate to # the pixel coordinate of ax (i.e., ax.transData). ax.get_grid_helper().update_grid_finder(aux_trans=tr_helio) # Now we defina parasite axes with galactocentric & heliocentric # coordinates. # A parasite axes with given transform gc_polar = ParasiteAxesAuxTrans(ax, tr, "equal") ax.parasites.append(gc_polar) # note that ax2.transData == tr + galactocentric_axis.transData # Anthing you draw in ax2 will match the ticks and grids of galactocentric_axis. hc_polar = ParasiteAxesAuxTrans(ax, tr_helio, "equal") ax.parasites.append(hc_polar) return ax, ax_pixgrid, gc_polar, hc_polar
def curvelinear_test2(fig, gs=None, xcenter=0.0, ycenter=17.3, xwidth=1.5, ywidth=1.5, xlabel=xlabel, ylabel=ylabel, xgrid_density=8, ygrid_density=5): """ polar projection, but in a rectangular box. """ tr = Affine2D().translate(0,90) tr += Affine2D().scale(np.pi/180., 1.) tr += PolarAxes.PolarTransform() tr += Affine2D().rotate(1.34) # This rotates the grid extreme_finder = angle_helper.ExtremeFinderCycle(10, 60, lon_cycle = 360, lat_cycle = None, lon_minmax = None, lat_minmax = (-90, np.inf), ) grid_locator1 = angle_helper.LocatorHMS(xgrid_density) #changes theta gridline count tick_formatter1 = angle_helper.FormatterHMS() grid_locator2 = angle_helper.LocatorDMS(ygrid_density) #changes theta gridline count tick_formatter2 = angle_helper.FormatterDMS() grid_helper = GridHelperCurveLinear(tr, extreme_finder=extreme_finder, grid_locator1=grid_locator1, grid_locator2=grid_locator2, tick_formatter1=tick_formatter1, tick_formatter2=tick_formatter2 ) # ax1 = SubplotHost(fig, rect, grid_helper=grid_helper) if gs is None: ax1 = SubplotHost(fig, 111, grid_helper=grid_helper) else: ax1 = SubplotHost(fig, gs, grid_helper=grid_helper) # make ticklabels of right and top axis visible. ax1.axis["right"].major_ticklabels.set_visible(False) ax1.axis["top"].major_ticklabels.set_visible(False) ax1.axis["bottom"].major_ticklabels.set_visible(True) #Turn off? # let right and bottom axis show ticklabels for 1st coordinate (angle) ax1.axis["right"].get_helper().nth_coord_ticks=0 ax1.axis["bottom"].get_helper().nth_coord_ticks=0 fig.add_subplot(ax1) grid_helper = ax1.get_grid_helper() # These move the grid ax1.set_xlim(xcenter-xwidth, xcenter+xwidth) # moves the origin left-right in ax1 ax1.set_ylim(ycenter-ywidth, ycenter+ywidth) # moves the origin up-down # ax1.set_xlim(-1.5, 1.4) # ax1.set_ylim(15.8, 18.8) if xlabel is not None: ax1.set_xlabel(xlabel) if ylabel is not None: ax1.set_ylabel(ylabel) # ax1.set_ylabel('Declination') # ax1.set_xlabel('Right Ascension') ax1.grid(True, linestyle='-') #ax1.grid(linestyle='--', which='x') # either keyword applies to both #ax1.grid(linestyle=':', which='y') # sets of gridlines return ax1,tr