def test_scatter_contour(): from astropy.io import fits from myimage_analysis import calculate_nhi import mygeometry as myg from mycoords import make_velocity_axis # Parameters # ---------- levels = (0.99, 0.985, 0.7) levels = ( 0.999, 0.998, 0.96, 0.86, 0.58, ) levels = 7 levels = np.logspace(np.log10(0.995), np.log10(0.50), 5) log_counts = 0 limits = [1, 10, -3, 30] limits = None # Begin test # ---------- data_dir = '/d/bip3/ezbc/perseus/data/' av = fits.getdata(data_dir + 'av/perseus_av_planck_tau353_5arcmin.fits') hi, hi_header = fits.getdata(data_dir + \ 'hi/perseus_hi_galfa_cube_regrid_planckres.fits', header=True) hi_vel_axis = make_velocity_axis(hi_header) nhi = calculate_nhi( cube=hi, velocity_axis=hi_vel_axis, velocity_range=[0, 10], ) # Drop the NaNs from the images indices = np.where((av == av) &\ (nhi == nhi) ) av_nonans = av[indices] nhi_nonans = nhi[indices] fig, ax = plt.subplots() if limits is None: xmin = np.min(nhi_nonans) ymin = np.min(av_nonans) xmax = np.max(nhi_nonans) ymax = np.max(av_nonans) xscalar = 0.25 * xmax yscalar = 0.25 * ymax limits = [ xmin - xscalar, xmax + xscalar, ymin - yscalar, ymax + yscalar ] contour_range = ((limits[0], limits[1]), (limits[2], limits[3])) cmap = myplt.truncate_colormap(plt.cm.binary, 0.2, 1, 1000) l1 = myplt.scatter_contour( nhi_nonans.ravel(), av_nonans.ravel(), threshold=3, log_counts=log_counts, levels=levels, ax=ax, histogram2d_args=dict(bins=30, range=contour_range), plot_args=dict(marker='o', linestyle='none', color='black', alpha=0.3, markersize=2), contour_args=dict( #cmap=plt.cm.binary, cmap=cmap, #cmap=cmap, ), ) scale = ['linear', 'linear'] ax.set_xscale(scale[0], nonposx='clip') ax.set_yscale(scale[1], nonposy='clip') ax.set_xlim(limits[0], limits[1]) ax.set_ylim(limits[2], limits[3]) # Adjust asthetics ax.set_xlabel(r'$N($H$\textsc{i}) \times\,10^{20}$ cm$^{-2}$') ax.set_ylabel(r'$A_V$ [mag]') #ax.set_title(core_names[i]) ax.legend(loc='lower right') plt.savefig('test_plots/test_scatter_contour.png')
def plot_planck_vs_2mass( av_k09, av_pl, filename=None, av_error=None, contour_plot=True, levels=10, plot_median=True, limits=None, labels=['', ''], scale=('linear', 'linear'), title='', fit_labels=['', ''], gridsize=(100, 100), ): # import external modules import numpy as np import math import matplotlib.pyplot as plt import matplotlib from matplotlib import cm from astroML.plotting import scatter_contour from mpl_toolkits.axes_grid1.axes_grid import AxesGrid import myplotting as myplt # set up plot aesthetics # ---------------------- plt.close plt.clf() # color map myplt.set_color_cycle(num_colors=3) # Create figure instance fig = plt.figure(figsize=(3.6, 3.6)) axes = AxesGrid( fig, (1, 1, 1), nrows_ncols=(1, 1), ngrids=1, axes_pad=0.25, aspect=False, label_mode='L', share_all=True, #cbar_mode='single', cbar_pad=0.1, cbar_size=0.2, ) # Drop the NaNs from the images if type(av_error) is float or av_error is None: indices = np.where((av_pl == av_pl) &\ (av_k09 == av_k09) ) av_pl = av_pl[indices] av_k09 = av_k09[indices] # Create plot ax = axes[0] if limits is None: xmin = np.min(av_k09) ymin = np.min(av_k09) xmax = np.max(av_pl) ymax = np.max(av_pl) xscalar = 0.15 * xmax yscalar = 0.15 * ymax limits = [ xmin - xscalar, xmax + xscalar, ymin - yscalar, ymax + yscalar ] if contour_plot: contour_range = ((limits[0], limits[1]), (limits[2], limits[3])) cmap = myplt.truncate_colormap(plt.cm.binary, 0.2, 1, 1000) l1 = myplt.scatter_contour( av_k09, av_pl, threshold=3, log_counts=1, levels=levels, ax=ax, histogram2d_args=dict(bins=30, range=contour_range), plot_args=dict(marker='o', linestyle='none', color='black', alpha=0.3, markersize=2), contour_args=dict( #cmap=plt.cm.binary, cmap=cmap, #cmap=cmap, ), ) else: image = ax.errorbar(nhi_nonans.ravel(), av_nonans.ravel(), yerr=(av_error_nonans.ravel()), alpha=0.2, color='k', marker='^', ecolor='k', linestyle='None', markersize=3) # Plot sensitivies #av_limit = np.median(av_errors[0]) #ax.axvline(av_limit, color='k', linestyle='--') # Plot 1 to 1 pline if 1: x_fit = np.linspace(-5, 200, 1000) p, V = \ np.polyfit(av_k09, av_pl, deg=1, #w=np.abs(1.0/av_error_nonans.ravel()), cov=True ) y_poly_fit = p[0] * x_fit + p[1] if 1: ax.plot(x_fit, y_poly_fit, color='r', linestyle='dashed', linewidth=2, label=\ 'Poly fit: \n' + \ fit_labels[0] + ' = ' + '{0:.1f}'.format(p[0]) + \ r'$\times$ ' + fit_labels[1] + \ ' + {0:.1f} mag'.format(p[1]), alpha=0.7, ) if 0: from scipy.interpolate import UnivariateSpline spl = UnivariateSpline(av_k09, av_pl) ax.plot(x_fit, spl(x_fit), linewidth=3, alpha=0.5) if 0: print('Bootstrapping...') # bootstrap conf intervals import scipy as sp bootindex = sp.random.random_integers nboot = 20 x_fit = av_k09 y_fit = p[0] * x_fit + p[1] r = av_pl - y_fit for i in xrange( nboot): # loop over n bootstrap samples from the resids pc = sp.polyfit(av_k09, y_fit + r[bootindex(0, len(r) - 1, len(r))], 1) ax.plot(x_fit, sp.polyval(pc, x_fit), 'k-', linewidth=2, alpha=1.0 / float(nboot)) # Annotations anno_xpos = 0.95 ax.set_xscale(scale[0], nonposx='clip') ax.set_yscale(scale[1], nonposy='clip') ax.set_xlim(limits[0], limits[1]) ax.set_ylim(limits[2], limits[3]) # Adjust asthetics #ax.set_xlabel(r'$A_{V,{\rm K+09}}$ [mag]') #ax.set_ylabel(r'$A_{V,{\rm Planck}}$ [mag]') ax.set_xlabel(labels[0]) ax.set_ylabel(labels[1]) ax.set_title(title) ax.legend(loc='best') if filename is not None: plt.savefig(filename)
def plot_diffuseLOS_map(header=None, av_image=None, df=None, core_dict=None, limits=None, filename=None, vlimits=(None, None), contours=None, parameter='phi_cnm', models=['krumholz', 'sternberg']): # Import external modules import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import AxesGrid import pywcsgrid2 as wcs from matplotlib.patches import Polygon import matplotlib.patheffects as PathEffects import myplotting as myplt # Set up plot aesthetics # ---------------------- #plt.close;plt.clf() # Color map cmap = plt.cm.copper # Color cycle, grabs colors from cmap color_cycle = [cmap(i) for i in np.linspace(0, 0.8, 2)] font_scale = 9 # Create figure instance fig = plt.figure(figsize=(3.6, 10)) if 0: parameters = [] #if 'krumholz' in models: # parameters.append('phi_cnm', 'alphaG', 'hi_transition', 'n_H', 'T_H'] parameters = [ 'fraction_diffuse', ] ngrids = len(parameters) nrows_ncols = (ngrids, 1) axesgrid = AxesGrid(fig, (1, 1, 1), nrows_ncols=nrows_ncols, ngrids=ngrids, cbar_mode="each", cbar_location='top', cbar_pad="2%", cbar_size='6%', axes_pad=0.1, axes_class=(wcs.Axes, dict(header=header)), aspect=True, label_mode='L', share_all=False) # ------------------ # Av image # ------------------ for i in xrange(ngrids): # create axes ax = axesgrid[i] # show the image X, Y = np.meshgrid(np.arange(av_image.shape[1]), np.arange(av_image.shape[0])) im = ax.contour( X, Y, av_image, origin='lower', levels=contours, cmap=myplt.truncate_colormap( plt.cm.binary, minval=0.3, ) #vmin=vlimits[0], #vmax=vlimits[1], #norm=matplotlib.colors.LogNorm() ) # Asthetics ax.set_display_coord_system("fk5") ax.set_ticklabel_type("hms", "dms") ax.set_xlabel('Right Ascension [J2000]', ) ax.set_ylabel('Declination [J2000]', ) ax.locator_params(nbins=4) # plot limits if limits is not None: limits_pix = myplt.convert_wcs_limits(limits, header) ax.set_xlim(limits_pix[0], limits_pix[1]) ax.set_ylim(limits_pix[2], limits_pix[3]) # Plot cores for each cloud # ------------------------- from matplotlib.patches import Circle from matplotlib.collections import PatchCollection parameter = parameters[i] patches = get_patches(df, header) cmap = myplt.truncate_colormap(plt.cm.copper, minval=0.1, maxval=1.0) collection = PatchCollection( patches, cmap=cmap, edgecolors='k', linewidth=0.75, zorder=1000, ) # set values in collection collection_values = [] if parameter in [ 'fraction_diffuse', ]: collection.set_array(df[parameter]) else: for core in df['core']: collection_values.append(core_dict[core][parameter]) collection.set_array(np.array(collection_values)) ax.add_collection(collection, ) # colorbar #cbar = axesgrid.cbar_axes[i].colorbar(collection) cbar = ax.cax.colorbar(collection) if parameter == 'fraction_diffuse': cbar.set_label_text(r'Fraction of Diffuse LOS', ) if filename is not None: plt.savefig(filename, bbox_inches='tight', dpi=600)
def test_scatter_contour_log(): import myimage_analysis as myia # Parameters # ---------- levels = (0.99, 0.985, 0.7) levels = ( 0.999, 0.998, 0.96, 0.86, 0.58, ) levels = 7 levels = np.logspace(np.log10(0.995), np.log10(0.50), 5) log_counts = 0 limits = [1, 10, -3, 30] limits = None x = np.linspace(1, 100, 10000) y = x**3 + np.random.normal(10, size=10000) + 100 y_real = x**3 + 100 x_nonans, y_nonans = myia.mask_nans((x, y)) scale = ['linear', 'log'] fig, ax = plt.subplots() if limits is None: xmin = np.min(x_nonans) ymin = np.min(y_nonans) xmax = np.max(x_nonans) ymax = np.max(y_nonans) if scale[0] == 'linear': xscalar = 0.25 * xmax xlims = xmin - xscalar, xmax + xscalar elif scale[0] == 'log': xscalar = 0.25 xlims = xmin * xscalar, xmax / xscalar if scale[1] == 'linear': yscalar = 0.25 * ymax ylims = ymin - yscalar, ymax + yscalar elif scale[1] == 'log': yscalar = 0.25 ylims = ymin * yscalar, ymax / yscalar limits = [xlims[0], xlims[1], ylims[0], ylims[1]] if 1: bins = [ 30, np.logspace(np.log10(limits[2]), np.log10(limits[3]), 30), ] else: bins = 40 print bins contour_range = ((limits[0], limits[1]), (limits[2], limits[3])) cmap = myplt.truncate_colormap(plt.cm.binary, 0.2, 1, 1000) ax.set_xscale(scale[0], nonposx='clip') ax.set_yscale(scale[1], nonposy='clip') l1 = myplt.scatter_contour( x_nonans.ravel(), y_nonans.ravel(), threshold=3, log_counts=log_counts, levels=levels, ax=ax, extent=limits, histogram2d_args=dict( bins=bins, range=contour_range, ), plot_args=dict(marker='o', linestyle='none', color='black', alpha=0.3, markersize=2), contour_args=dict( #cmap=plt.cm.binary, cmap=cmap, #cmap=cmap, ), ) ax.plot(x, y_real, color='r', alpha=0.5, linewidth=2) ax.set_xlim(limits[0], limits[1]) ax.set_ylim(limits[2], limits[3]) # Adjust asthetics ax.set_xlabel(r'x') ax.set_ylabel(r'y') #ax.set_title(core_names[i]) ax.legend(loc='lower right') plt.savefig('test_plots/test_scatter_contour_log.png')
def plot_diffuseLOS_map(header=None, av_image=None, df=None, core_dict=None, limits=None, filename=None, vlimits=(None,None), contours=None, parameter='phi_cnm', models=['krumholz', 'sternberg']): # Import external modules import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import AxesGrid import pywcsgrid2 as wcs from matplotlib.patches import Polygon import matplotlib.patheffects as PathEffects import myplotting as myplt # Set up plot aesthetics # ---------------------- #plt.close;plt.clf() # Color map cmap = plt.cm.copper # Color cycle, grabs colors from cmap color_cycle = [cmap(i) for i in np.linspace(0, 0.8, 2)] font_scale = 9 # Create figure instance fig = plt.figure(figsize=(3.6, 10)) if 0: parameters = [] #if 'krumholz' in models: # parameters.append('phi_cnm', 'alphaG', 'hi_transition', 'n_H', 'T_H'] parameters = ['fraction_diffuse',] ngrids=len(parameters) nrows_ncols=(ngrids,1) axesgrid = AxesGrid(fig, (1,1,1), nrows_ncols=nrows_ncols, ngrids=ngrids, cbar_mode="each", cbar_location='top', cbar_pad="2%", cbar_size='6%', axes_pad=0.1, axes_class=(wcs.Axes, dict(header=header)), aspect=True, label_mode='L', share_all=False) # ------------------ # Av image # ------------------ for i in xrange(ngrids): # create axes ax = axesgrid[i] # show the image X, Y = np.meshgrid(np.arange(av_image.shape[1]), np.arange(av_image.shape[0])) im = ax.contour(X, Y, av_image, origin='lower', levels=contours, cmap=myplt.truncate_colormap(plt.cm.binary, minval=0.3,) #vmin=vlimits[0], #vmax=vlimits[1], #norm=matplotlib.colors.LogNorm() ) # Asthetics ax.set_display_coord_system("fk5") ax.set_ticklabel_type("hms", "dms") ax.set_xlabel('Right Ascension [J2000]',) ax.set_ylabel('Declination [J2000]',) ax.locator_params(nbins=4) # plot limits if limits is not None: limits_pix = myplt.convert_wcs_limits(limits, header) ax.set_xlim(limits_pix[0],limits_pix[1]) ax.set_ylim(limits_pix[2],limits_pix[3]) # Plot cores for each cloud # ------------------------- from matplotlib.patches import Circle from matplotlib.collections import PatchCollection parameter = parameters[i] patches = get_patches(df, header) cmap = myplt.truncate_colormap(plt.cm.copper, minval=0.1, maxval=1.0) collection = PatchCollection(patches, cmap=cmap, edgecolors='k', linewidth=0.75, zorder=1000, ) # set values in collection collection_values = [] if parameter in ['fraction_diffuse',]: collection.set_array(df[parameter]) else: for core in df['core']: collection_values.append(core_dict[core][parameter]) collection.set_array(np.array(collection_values)) ax.add_collection(collection, ) # colorbar #cbar = axesgrid.cbar_axes[i].colorbar(collection) cbar = ax.cax.colorbar(collection) if parameter == 'fraction_diffuse': cbar.set_label_text(r'Fraction of Diffuse LOS',) if filename is not None: plt.savefig(filename, bbox_inches='tight', dpi=600)
def plot_params_map(header=None, av_image=None, df=None, limits=None, filename=None, vlimits=(None, None), contours=None, parameter='phi_cnm'): # Import external modules import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import AxesGrid import pywcsgrid2 as wcs from matplotlib.patches import Polygon import matplotlib.patheffects as PathEffects import myplotting as myplt # Set up plot aesthetics # ---------------------- #plt.close;plt.clf() # Color map cmap = plt.cm.copper # Color cycle, grabs colors from cmap color_cycle = [cmap(i) for i in np.linspace(0, 0.8, 2)] font_scale = 9 # Create figure instance fig = plt.figure(figsize=(3.6, 5)) nrows_ncols = (3, 1) ngrids = 3 axesgrid = AxesGrid(fig, (1, 1, 1), nrows_ncols=nrows_ncols, ngrids=ngrids, cbar_mode="each", cbar_location='right', cbar_pad="2%", cbar_size='3%', axes_pad=0.1, axes_class=(wcs.Axes, dict(header=header)), aspect=True, label_mode='L', share_all=False) # ------------------ # Av image # ------------------ parameters = ['phi_cnm', 'alphaG', 'hi_transition'] for i in xrange(ngrids): # create axes ax = axesgrid[i] # show the image X, Y = np.meshgrid(np.arange(av_image.shape[1]), np.arange(av_image.shape[0])) im = ax.contour( X, Y, av_image, origin='lower', levels=contours, cmap=myplt.truncate_colormap( plt.cm.binary, minval=0.3, ) #vmin=vlimits[0], #vmax=vlimits[1], #norm=matplotlib.colors.LogNorm() ) # Asthetics ax.set_display_coord_system("fk5") ax.set_ticklabel_type("hms", "dms") ax.set_xlabel('Right Ascension [J2000]', ) ax.set_ylabel('Declination [J2000]', ) ax.locator_params(nbins=4) # plot limits if limits is not None: limits_pix = myplt.convert_wcs_limits(limits, header) ax.set_xlim(limits_pix[0], limits_pix[1]) ax.set_ylim(limits_pix[2], limits_pix[3]) # Plot cores for each cloud # ------------------------- from matplotlib.patches import Circle from matplotlib.collections import PatchCollection parameter = parameters[i] patches = get_patches(df, header) cmap = myplt.truncate_colormap(plt.cm.copper, minval=0.1, maxval=1.0) collection = PatchCollection( patches, cmap=cmap, edgecolors='none', zorder=1000, ) collection.set_array(df[parameter]) ax.add_collection(collection, ) # colorbar #cbar = axesgrid.cbar_axes[i].colorbar(collection) cbar = ax.cax.colorbar(collection) if parameter == 'phi_cnm': cbar.set_label_text(r'$\phi_{\rm CNM}$', ) elif parameter == 'alphaG': cbar.set_label_text(r'$\alpha G$', ) elif parameter == 'hi_transition': cbar.set_label_text(r'$\Sigma_{\rm HI,trans}$ ' + \ r'$[M_\odot\,{\rm pc}^{-2}]$',) if filename is not None: plt.savefig(filename, bbox_inches='tight', dpi=100)
def plot_av_vs_beta_grid(plot_dict, filename=None, levels=7, limits=None, poly_fit=False, contour=True, scale=['linear','linear']): ''' Plots a heat map of likelihoodelation values as a function of velocity width and velocity center. Parameters ---------- cloud : cloudpy.Cloud If provided, properties taken from cloud.props. ''' # Import external modules import numpy as np import matplotlib.pyplot as plt import myplotting as myplt from mpl_toolkits.axes_grid1.axes_grid import AxesGrid # Set up plot aesthetics # ---------------------- plt.close;plt.clf() font_scale = 9 params = { 'figure.figsize': (3.6, 8), #'figure.titlesize': font_scale, } plt.rcParams.update(params) # Create figure instance fig = plt.figure() axes = AxesGrid(fig, (1,1,1), nrows_ncols=(3, 1), ngrids=3, axes_pad=0.1, aspect=False, label_mode='L', share_all=True) for i, cloud_name in enumerate(plot_dict): x = plot_dict[cloud_name]['av'] y = plot_dict[cloud_name]['beta'] ax = axes[i] if 'log' not in scale: ax.locator_params(nbins = 6) # Drop the NaNs from the images indices = np.where((x == x) &\ (y == y) ) x_nonans = x[indices] y_nonans = y[indices] ax = axes[i] if contour: if i == 0: if limits is None: xmin = np.min(x_nonans) ymin = np.min(y_nonans) xmax = np.max(x_nonans) ymax = np.max(y_nonans) xscalar = 0.15 * xmax yscalar = 0.15 * ymax limits = [xmin - xscalar, xmax + xscalar, ymin - yscalar, ymax + yscalar] contour_range = ((limits[0], limits[1]), (limits[2], limits[3])) cmap = myplt.truncate_colormap(plt.cm.binary, 0.2, 1, 1000) l1 = myplt.scatter_contour(x_nonans.ravel(), y_nonans.ravel(), threshold=2, log_counts=1, levels=levels, ax=ax, #errors=x_error_nonans.ravel(), histogram2d_args=dict(bins=40, range=contour_range), plot_args=dict(marker='o', linestyle='none', color='black', alpha=0.3, markersize=2), contour_args=dict( #cmap=plt.cm.binary, cmap=cmap, #cmap=cmap, ), ) else: image = ax.errorbar( x_nonans.ravel()[::100], y_nonans.ravel()[::100], yerr=(x_error_nonans.ravel()[::100]), alpha=0.2, color='k', marker='^', ecolor='k', linestyle='None', markersize=3 ) c_cycle = myplt.set_color_cycle(num_colors=2, cmap_limits=[0.5, 0.7]) if poly_fit: from scipy.optimize import curve_fit p = np.polyfit(x_nonans, y_nonans, 1) x_fit = np.linspace(-10, 100, 100) y_poly_fit = p[0] * x_fit + p[1] ax.plot(x_fit, y_poly_fit, color=c_cycle[1], linestyle='-', linewidth=2, label=\ 'Polynomial fit: \n' + \ r'$\beta$ = {0:.2f}'.format(p[0] * 100.0) + \ r'$\frac{{A_V}}{{100 \rm mag}}$ + {0:.2f}'.format(p[1]) + \ r'', alpha=0.7, ) # Annotations #anno_xpos = 0.95 ax.set_xscale(scale[0], nonposx = 'clip') ax.set_yscale(scale[1], nonposy = 'clip') ax.set_xlim(limits[0],limits[1]) ax.set_ylim(limits[2],limits[3]) # Adjust asthetics ax.set_ylabel(r'$\beta$') ax.set_xlabel(r'$A_V$ [mag]') if 1: loc = 'lower right' elif i == 0: loc = 'upper left' else: loc = 'lower left' ax.legend(loc=loc) ax.annotate(cloud_name.capitalize(), #xytext=(0.96, 0.9), xy=(0.96, 0.96), textcoords='axes fraction', xycoords='axes fraction', size=10, color='k', bbox=dict(boxstyle='square', facecolor='w', alpha=1), horizontalalignment='right', verticalalignment='top', ) if filename is not None: plt.draw() plt.savefig(filename, bbox_inches='tight', dpi=400)
def plot_params_map(header=None, av_image=None, df=None, limits=None, filename=None, vlimits=(None,None), contours=None, parameter='phi_cnm'): # Import external modules import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import AxesGrid import pywcsgrid2 as wcs from matplotlib.patches import Polygon import matplotlib.patheffects as PathEffects import myplotting as myplt # Set up plot aesthetics # ---------------------- #plt.close;plt.clf() # Color map cmap = plt.cm.copper # Color cycle, grabs colors from cmap color_cycle = [cmap(i) for i in np.linspace(0, 0.8, 2)] font_scale = 9 # Create figure instance fig = plt.figure(figsize=(3.6, 5)) nrows_ncols=(3,1) ngrids=3 axesgrid = AxesGrid(fig, (1,1,1), nrows_ncols=nrows_ncols, ngrids=ngrids, cbar_mode="each", cbar_location='right', cbar_pad="2%", cbar_size='3%', axes_pad=0.1, axes_class=(wcs.Axes, dict(header=header)), aspect=True, label_mode='L', share_all=False) # ------------------ # Av image # ------------------ parameters = ['phi_cnm', 'alphaG', 'hi_transition'] for i in xrange(ngrids): # create axes ax = axesgrid[i] # show the image X, Y = np.meshgrid(np.arange(av_image.shape[1]), np.arange(av_image.shape[0])) im = ax.contour(X, Y, av_image, origin='lower', levels=contours, cmap=myplt.truncate_colormap(plt.cm.binary, minval=0.3,) #vmin=vlimits[0], #vmax=vlimits[1], #norm=matplotlib.colors.LogNorm() ) # Asthetics ax.set_display_coord_system("fk5") ax.set_ticklabel_type("hms", "dms") ax.set_xlabel('Right Ascension [J2000]',) ax.set_ylabel('Declination [J2000]',) ax.locator_params(nbins=4) # plot limits if limits is not None: limits_pix = myplt.convert_wcs_limits(limits, header) ax.set_xlim(limits_pix[0],limits_pix[1]) ax.set_ylim(limits_pix[2],limits_pix[3]) # Plot cores for each cloud # ------------------------- from matplotlib.patches import Circle from matplotlib.collections import PatchCollection parameter = parameters[i] patches = get_patches(df, header) cmap = myplt.truncate_colormap(plt.cm.copper, minval=0.1, maxval=1.0) collection = PatchCollection(patches, cmap=cmap, edgecolors='none', zorder=1000, ) collection.set_array(df[parameter]) ax.add_collection(collection, ) # colorbar #cbar = axesgrid.cbar_axes[i].colorbar(collection) cbar = ax.cax.colorbar(collection) if parameter == 'phi_cnm': cbar.set_label_text(r'$\phi_{\rm CNM}$',) elif parameter == 'alphaG': cbar.set_label_text(r'$\alpha G$',) elif parameter == 'hi_transition': cbar.set_label_text(r'$\Sigma_{\rm HI,trans}$ ' + \ r'$[M_\odot\,{\rm pc}^{-2}]$',) if filename is not None: plt.savefig(filename, bbox_inches='tight', dpi=100)
def test_scatter_contour(): from astropy.io import fits from myimage_analysis import calculate_nhi import mygeometry as myg from mycoords import make_velocity_axis # Parameters # ---------- levels = (0.99, 0.985, 0.7) levels = (0.999, 0.998, 0.96, 0.86, 0.58,) levels = 7 levels = np.logspace(np.log10(0.995), np.log10(0.50), 5) log_counts = 0 limits = [1, 10, -3, 30] limits = None # Begin test # ---------- data_dir = '/d/bip3/ezbc/perseus/data/' av = fits.getdata(data_dir + 'av/perseus_av_planck_tau353_5arcmin.fits') hi, hi_header = fits.getdata(data_dir + \ 'hi/perseus_hi_galfa_cube_regrid_planckres.fits', header=True) hi_vel_axis = make_velocity_axis(hi_header) nhi = calculate_nhi(cube=hi, velocity_axis=hi_vel_axis, velocity_range=[0, 10], ) # Drop the NaNs from the images indices = np.where((av == av) &\ (nhi == nhi) ) av_nonans = av[indices] nhi_nonans = nhi[indices] fig, ax = plt.subplots() if limits is None: xmin = np.min(nhi_nonans) ymin = np.min(av_nonans) xmax = np.max(nhi_nonans) ymax = np.max(av_nonans) xscalar = 0.25 * xmax yscalar = 0.25 * ymax limits = [xmin - xscalar, xmax + xscalar, ymin - yscalar, ymax + yscalar] contour_range = ((limits[0], limits[1]), (limits[2], limits[3])) cmap = myplt.truncate_colormap(plt.cm.binary, 0.2, 1, 1000) l1 = myplt.scatter_contour(nhi_nonans.ravel(), av_nonans.ravel(), threshold=3, log_counts=log_counts, levels=levels, ax=ax, histogram2d_args=dict(bins=30, range=contour_range), plot_args=dict(marker='o', linestyle='none', color='black', alpha=0.3, markersize=2), contour_args=dict( #cmap=plt.cm.binary, cmap=cmap, #cmap=cmap, ), ) scale = ['linear', 'linear'] ax.set_xscale(scale[0], nonposx = 'clip') ax.set_yscale(scale[1], nonposy = 'clip') ax.set_xlim(limits[0],limits[1]) ax.set_ylim(limits[2],limits[3]) # Adjust asthetics ax.set_xlabel(r'$N($H$\textsc{i}) \times\,10^{20}$ cm$^{-2}$') ax.set_ylabel(r'$A_V$ [mag]') #ax.set_title(core_names[i]) ax.legend(loc='lower right') plt.savefig('test_plots/test_scatter_contour.png')
def plot_planck_vs_2mass(av_k09, av_pl, filename=None, av_error=None, contour_plot=True, levels=10, plot_median=True, limits=None, labels=['',''], scale=('linear','linear'), title = '', fit_labels=['',''], gridsize=(100,100),): # import external modules import numpy as np import math import matplotlib.pyplot as plt import matplotlib from matplotlib import cm from astroML.plotting import scatter_contour from mpl_toolkits.axes_grid1.axes_grid import AxesGrid import myplotting as myplt # set up plot aesthetics # ---------------------- plt.close;plt.clf() # color map myplt.set_color_cycle(num_colors=3) # Create figure instance fig = plt.figure(figsize=(3.6, 3.6)) axes = AxesGrid(fig, (1,1,1), nrows_ncols=(1, 1), ngrids=1, axes_pad=0.25, aspect=False, label_mode='L', share_all=True, #cbar_mode='single', cbar_pad=0.1, cbar_size=0.2, ) # Drop the NaNs from the images if type(av_error) is float or av_error is None: indices = np.where((av_pl == av_pl) &\ (av_k09 == av_k09) ) av_pl = av_pl[indices] av_k09 = av_k09[indices] # Create plot ax = axes[0] if limits is None: xmin = np.min(av_k09) ymin = np.min(av_k09) xmax = np.max(av_pl) ymax = np.max(av_pl) xscalar = 0.15 * xmax yscalar = 0.15 * ymax limits = [xmin - xscalar, xmax + xscalar, ymin - yscalar, ymax + yscalar] if contour_plot: contour_range = ((limits[0], limits[1]), (limits[2], limits[3])) cmap = myplt.truncate_colormap(plt.cm.binary, 0.2, 1, 1000) l1 = myplt.scatter_contour(av_k09, av_pl, threshold=3, log_counts=1, levels=levels, ax=ax, histogram2d_args=dict(bins=30, range=contour_range), plot_args=dict(marker='o', linestyle='none', color='black', alpha=0.3, markersize=2), contour_args=dict( #cmap=plt.cm.binary, cmap=cmap, #cmap=cmap, ), ) else: image = ax.errorbar(nhi_nonans.ravel(), av_nonans.ravel(), yerr=(av_error_nonans.ravel()), alpha=0.2, color='k', marker='^', ecolor='k', linestyle='None', markersize=3 ) # Plot sensitivies #av_limit = np.median(av_errors[0]) #ax.axvline(av_limit, color='k', linestyle='--') # Plot 1 to 1 pline if 1: x_fit = np.linspace(-5, 200, 1000) p, V = \ np.polyfit(av_k09, av_pl, deg=1, #w=np.abs(1.0/av_error_nonans.ravel()), cov=True ) y_poly_fit = p[0] * x_fit + p[1] if 1: ax.plot(x_fit, y_poly_fit, color='r', linestyle='dashed', linewidth=2, label=\ 'Poly fit: \n' + \ fit_labels[0] + ' = ' + '{0:.1f}'.format(p[0]) + \ r'$\times$ ' + fit_labels[1] + \ ' + {0:.1f} mag'.format(p[1]), alpha=0.7, ) if 0: from scipy.interpolate import UnivariateSpline spl = UnivariateSpline(av_k09, av_pl) ax.plot(x_fit, spl(x_fit), linewidth=3, alpha=0.5) if 0: print('Bootstrapping...') # bootstrap conf intervals import scipy as sp bootindex = sp.random.random_integers nboot = 20 x_fit = av_k09 y_fit = p[0] * x_fit + p[1] r = av_pl - y_fit for i in xrange(nboot): # loop over n bootstrap samples from the resids pc = sp.polyfit(av_k09, y_fit + r[bootindex(0, len(r)-1, len(r))], 1) ax.plot(x_fit, sp.polyval(pc,x_fit), 'k-', linewidth=2, alpha=1.0/float(nboot)) # Annotations anno_xpos = 0.95 ax.set_xscale(scale[0], nonposx = 'clip') ax.set_yscale(scale[1], nonposy = 'clip') ax.set_xlim(limits[0],limits[1]) ax.set_ylim(limits[2],limits[3]) # Adjust asthetics #ax.set_xlabel(r'$A_{V,{\rm K+09}}$ [mag]') #ax.set_ylabel(r'$A_{V,{\rm Planck}}$ [mag]') ax.set_xlabel(labels[0]) ax.set_ylabel(labels[1]) ax.set_title(title) ax.legend(loc='best') if filename is not None: plt.savefig(filename)
def plot_cores_map( header=None, contour_image=None, av_image=None, cores=None, cores_to_keep=None, props=None, cloud_dict=None, regions=None, title=None, limits=None, contours=None, boxes=False, savedir='./', filename=None, show=True, hi_vlimits=None, av_vlimits=None, ): # Import external modules import matplotlib.pyplot as plt import matplotlib import numpy as np from mpl_toolkits.axes_grid1 import ImageGrid import pyfits as pf import matplotlib.pyplot as plt import pywcsgrid2 as wcs import pywcs from pylab import cm # colormaps from matplotlib.patches import Polygon import matplotlib.patheffects as PathEffects # Set up plot aesthetics # ---------------------- plt.close plt.clf() # Color map cmap = plt.cm.gnuplot import myplotting as myplt cmap = myplt.truncate_colormap(plt.cm.copper, minval=0.2) # Color cycle, grabs colors from cmap color_cycle = [cmap(i) for i in np.linspace(0, 0.8, 2)] font_scale = 9 line_weight = 600 font_weight = 600 # Create figure instance fig = plt.figure(figsize=(7.5, 5)) if av_image is not None: nrows_ncols = (1, 1) ngrids = 1 imagegrid = ImageGrid(fig, (1, 1, 1), nrows_ncols=nrows_ncols, ngrids=ngrids, cbar_mode="each", cbar_location='right', cbar_pad="2%", cbar_size='3%', axes_pad=0.1, axes_class=(wcs.Axes, dict(header=header)), aspect=True, label_mode='L', share_all=True) # ------------------ # Av image # ------------------ # create axes ax = imagegrid[0] # show the image im = ax.imshow( av_image, interpolation='nearest', origin='lower', cmap=cmap, vmin=av_vlimits[0], vmax=av_vlimits[1], #norm=matplotlib.colors.LogNorm() ) # Asthetics ax.set_display_coord_system("fk5") ax.set_ticklabel_type("hms", "dms") ax.set_xlabel('Right Ascension [J2000]', ) ax.set_ylabel('Declination [J2000]', ) ax.locator_params(nbins=6) # colorbar cb = ax.cax.colorbar(im) cmap.set_bad(color='w') cb.set_label_text(r'$A_V$ [mag]', ) # plot limits if limits is not None: ax.set_xlim(limits[0], limits[2]) ax.set_ylim(limits[1], limits[3]) # Plot Av contours if contour_image is not None: ax.contour(contour_image, levels=contours, colors='r') # Plot cores for each cloud # ------------------------- count = 0 rects = [] core_labels = [] for i, cloud in enumerate(cloud_dict): cores = cloud_dict[cloud]['cores'] cores_in_cloud = [] for core in cores_to_keep: if core in cores: cores_in_cloud.append(core) # Convert sky to pix coordinates wcs_header = pywcs.WCS(header) for core in cores_in_cloud: pix_coords = cores[core]['center_pixel'] anno_color = (0.3, 0.5, 1) if 0: ax.scatter(pix_coords[0], pix_coords[1], color='w', s=100, marker='+', linewidths=1.5) try: vertices = np.copy(cores[core]['poly_verts']['pixel']) #[:, ::-1] rects.append( ax.add_patch( Polygon(vertices[:, ::-1], facecolor='none', edgecolor='w'))) core_labels.append(str(count) + ' - ' + core) n = float(vertices.shape[0]) center_xy = (np.sum(vertices[:, 1]) / n, np.sum(vertices[:, 0]) / n) if core == 'L1521': center_xy += np.array((1, 7)) ax.annotate( str(count), #xy=[pix_coords[0], pix_coords[1]], xy=center_xy, xytext=(-4, -4), label=core, textcoords='offset points', fontsize=font_scale * 0.75, color='k', path_effects=[ PathEffects.withStroke(linewidth=2, foreground="w") ]) count += 1 except KeyError: pass if props is not None: if 0: for region in props['region_name_pos']: if region == 'taurus1': region = 'taurus 1' if region == 'taurus2': region = 'taurus 2' ax.annotate(region.capitalize(), xy=props['region_name_pos'][region]['pixel'], xytext=(0, 0), textcoords='offset points', color='w', fontsize=7, zorder=10) # ax.legend(rects, core_labels, bbox_to_anchor=(1.05, 1), loc=2, # borderaxespad=0.) #ax.legend(rects, core_labels, bbox_to_anchor=(0., 1.02, 1., .102), loc=3, # ncol=5, mode="expand", borderaxespad=0.) ax.legend(rects, core_labels, loc='lower right', ncol=2, columnspacing=0.01, handlelength=0.1) if title is not None: fig.suptitle(title, fontsize=font_scale) if filename is not None: plt.savefig(savedir + filename, bbox_inches='tight') if show: fig.show()
def plot_cores_map(header=None, contour_image=None, av_image=None, cores=None, cores_to_keep=None, props=None, cloud_dict=None, regions=None, title=None, limits=None, contours=None, boxes=False, savedir='./', filename=None, show=True, hi_vlimits=None, av_vlimits=None,): # Import external modules import matplotlib.pyplot as plt import matplotlib import numpy as np from mpl_toolkits.axes_grid1 import ImageGrid import pyfits as pf import matplotlib.pyplot as plt import pywcsgrid2 as wcs import pywcs from pylab import cm # colormaps from matplotlib.patches import Polygon import matplotlib.patheffects as PathEffects # Set up plot aesthetics # ---------------------- plt.close;plt.clf() # Color map cmap = plt.cm.gnuplot import myplotting as myplt cmap = myplt.truncate_colormap(plt.cm.copper, minval=0.2) # Color cycle, grabs colors from cmap color_cycle = [cmap(i) for i in np.linspace(0, 0.8, 2)] font_scale = 9 line_weight = 600 font_weight = 600 # Create figure instance fig = plt.figure(figsize=(7.5, 5)) if av_image is not None: nrows_ncols=(1,1) ngrids=1 imagegrid = ImageGrid(fig, (1,1,1), nrows_ncols=nrows_ncols, ngrids=ngrids, cbar_mode="each", cbar_location='right', cbar_pad="2%", cbar_size='3%', axes_pad=0.1, axes_class=(wcs.Axes, dict(header=header)), aspect=True, label_mode='L', share_all=True) # ------------------ # Av image # ------------------ # create axes ax = imagegrid[0] # show the image im = ax.imshow(av_image, interpolation='nearest',origin='lower', cmap=cmap, vmin=av_vlimits[0], vmax=av_vlimits[1], #norm=matplotlib.colors.LogNorm() ) # Asthetics ax.set_display_coord_system("fk5") ax.set_ticklabel_type("hms", "dms") ax.set_xlabel('Right Ascension [J2000]',) ax.set_ylabel('Declination [J2000]',) ax.locator_params(nbins=6) # colorbar cb = ax.cax.colorbar(im) cmap.set_bad(color='w') cb.set_label_text(r'$A_V$ [mag]',) # plot limits if limits is not None: ax.set_xlim(limits[0],limits[2]) ax.set_ylim(limits[1],limits[3]) # Plot Av contours if contour_image is not None: ax.contour(contour_image, levels=contours, colors='r') # Plot cores for each cloud # ------------------------- count = 0 rects = [] core_labels = [] for i, cloud in enumerate(cloud_dict): cores = cloud_dict[cloud]['cores'] cores_in_cloud = [] for core in cores_to_keep: if core in cores: cores_in_cloud.append(core) # Convert sky to pix coordinates wcs_header = pywcs.WCS(header) for core in cores_in_cloud: pix_coords = cores[core]['center_pixel'] anno_color = (0.3, 0.5, 1) if 0: ax.scatter(pix_coords[0],pix_coords[1], color='w', s=100, marker='+', linewidths=1.5) try: vertices = np.copy(cores[core]['poly_verts']['pixel']) #[:, ::-1] rects.append(ax.add_patch(Polygon( vertices[:, ::-1], facecolor='none', edgecolor='w') ) ) core_labels.append(str(count) + ' - ' + core) n = float(vertices.shape[0]) center_xy = (np.sum(vertices[:, 1]) / n, np.sum(vertices[:, 0]) / n) if core == 'L1521': center_xy += np.array((1, 7)) ax.annotate(str(count), #xy=[pix_coords[0], pix_coords[1]], xy=center_xy, xytext=(-4,-4), label=core, textcoords='offset points', fontsize=font_scale*0.75, color='k', path_effects=[PathEffects.withStroke(linewidth=2, foreground="w")]) count += 1 except KeyError: pass if props is not None: if 0: for region in props['region_name_pos']: if region == 'taurus1': region = 'taurus 1' if region == 'taurus2': region = 'taurus 2' ax.annotate(region.capitalize(), xy=props['region_name_pos'][region]['pixel'], xytext=(0,0), textcoords='offset points', color='w', fontsize=7, zorder=10) # ax.legend(rects, core_labels, bbox_to_anchor=(1.05, 1), loc=2, # borderaxespad=0.) #ax.legend(rects, core_labels, bbox_to_anchor=(0., 1.02, 1., .102), loc=3, # ncol=5, mode="expand", borderaxespad=0.) ax.legend(rects, core_labels, loc='lower right', ncol=2, columnspacing=0.01, handlelength=0.1) if title is not None: fig.suptitle(title, fontsize=font_scale) if filename is not None: plt.savefig(savedir + filename, bbox_inches='tight') if show: fig.show()
def test_scatter_contour_log(): import myimage_analysis as myia # Parameters # ---------- levels = (0.99, 0.985, 0.7) levels = (0.999, 0.998, 0.96, 0.86, 0.58,) levels = 7 levels = np.logspace(np.log10(0.995), np.log10(0.50), 5) log_counts = 0 limits = [1, 10, -3, 30] limits = None x = np.linspace(1, 100, 10000) y = x**3 + np.random.normal(10, size=10000) + 100 y_real = x**3 + 100 x_nonans, y_nonans = myia.mask_nans((x,y)) scale = ['linear', 'log'] fig, ax = plt.subplots() if limits is None: xmin = np.min(x_nonans) ymin = np.min(y_nonans) xmax = np.max(x_nonans) ymax = np.max(y_nonans) if scale[0] == 'linear': xscalar = 0.25 * xmax xlims = xmin - xscalar, xmax + xscalar elif scale[0] == 'log': xscalar = 0.25 xlims = xmin * xscalar, xmax / xscalar if scale[1] == 'linear': yscalar = 0.25 * ymax ylims = ymin - yscalar, ymax + yscalar elif scale[1] == 'log': yscalar = 0.25 ylims = ymin * yscalar, ymax / yscalar limits = [xlims[0], xlims[1], ylims[0], ylims[1]] if 1: bins = [30, np.logspace(np.log10(limits[2]), np.log10(limits[3]), 30), ] else: bins = 40 print bins contour_range = ((limits[0], limits[1]), (limits[2], limits[3])) cmap = myplt.truncate_colormap(plt.cm.binary, 0.2, 1, 1000) ax.set_xscale(scale[0], nonposx = 'clip') ax.set_yscale(scale[1], nonposy = 'clip') l1 = myplt.scatter_contour(x_nonans.ravel(), y_nonans.ravel(), threshold=3, log_counts=log_counts, levels=levels, ax=ax, extent=limits, histogram2d_args=dict(bins=bins, range=contour_range, ), plot_args=dict(marker='o', linestyle='none', color='black', alpha=0.3, markersize=2), contour_args=dict( #cmap=plt.cm.binary, cmap=cmap, #cmap=cmap, ), ) ax.plot(x, y_real, color='r', alpha=0.5, linewidth=2) ax.set_xlim(limits[0],limits[1]) ax.set_ylim(limits[2],limits[3]) # Adjust asthetics ax.set_xlabel(r'x') ax.set_ylabel(r'y') #ax.set_title(core_names[i]) ax.legend(loc='lower right') plt.savefig('test_plots/test_scatter_contour_log.png')