Hi Sean, I've been trying to think of the easiest way to do this in the framework you suggest, and I have a few ideas. The simplest way would likely be to use a different matplotlib normalizer for your particle colors: https://matplotlib.org/3.1.1/tutorials/colors/colormapnorms.html https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.colors.Normalize.html Since you're already accessing the plot.cax objects, you should be able to swap it there. You should then be able to avoid doing anything with derived fields, etc, as you could control the color maps themselves. Do you think that could be a workable solution? -Matt On Thu, Jan 2, 2020 at 5:52 PM Sean Larkin via yt-users <yt-users@python.org> wrote:
Hello All,
I have a question about the Projection plot function in yt. I have a script that plots the smallest mass darkmatter particles of a simulation in all 3 of the 2-d coordinate projections, and overplots the halos found by a halo finder. This script works, and currently plots the colorbar based on the mass in a given 2-d bin as done in some of the basic yt plots included in the website. I am wondering if it is possible to have the color scheme of the particles be based on the squared mass or squared density of the particles in any given 2-d bin, so that the higher density regions are highlighted compared to the background lower density regions. I have included the plotting part of my script below, in case it is helpful.
I hope everyone is having a great New Year!
ds = yt.load(VELA_snaps[position[0]]) domain_width = float(ds.domain_width.in_units('Mpc/h')[0]) ad = ds.all_data() masses = yt.np.unique(ad[('darkmatter', 'particle_mass')]) #filter out the darkmatter0 particles def mass_filter(pfilter, data): filter = data[(pfilter.filtered_type, 'particle_mass')] == masses[0] return filter yt.add_particle_filter('darkmatter0', function=mass_filter, filtered_type='darkmatter', requires=['particle_mass']) ds.add_particle_filter('darkmatter0')
scale = float(ds.scale_factor)
fig = plt.figure()
grid = AxesGrid(fig, (0.075,0.075,10,5), nrows_ncols = (3, 1), axes_pad = 1.0, label_mode = "L", share_all = False, cbar_location="right", cbar_mode="each", cbar_size="3%", cbar_pad="0%")
zoom = 10
x0 = float(consistent.halo_data_sorted[index][0][17]) * scale / domain_width y0 = float(consistent.halo_data_sorted[index][0][18]) * scale / domain_width z0 = float(consistent.halo_data_sorted[index][0][19]) * scale / domain_width center = [x0, y0, z0]
a = yt.ParticlePlot(ds, ('darkmatter0', 'particle_position_x'), ('darkmatter0', 'particle_position_y'),\ ('darkmatter0', 'particle_mass'), center=center) a.set_unit(('darkmatter0','particle_mass'), 'Msun') a.zoom(zoom) b = yt.ParticlePlot(ds, ('darkmatter0', 'particle_position_y'), ('darkmatter0', 'particle_position_z'),\ ('darkmatter0', 'particle_mass'), center=center) b.set_unit(('darkmatter0','particle_mass'), 'Msun') b.zoom(zoom) c = yt.ParticlePlot(ds, ('darkmatter0', 'particle_position_z'), ('darkmatter0', 'particle_position_x'),\ ('darkmatter0', 'particle_mass'), center=center) c.set_unit(('darkmatter0','particle_mass'), 'Msun') c.zoom(zoom)
for halos in consistent.halo_data_sorted[index]: x = float(halos[17]) * scale / domain_width y = float(halos[18]) * scale / domain_width z = float(halos[19]) * scale / domain_width r = float(halos[11]) * scale / .7 center = [x, y, z] a.annotate_sphere(center, radius=(r, 'kpc'), circle_args={'color':'red'}) b.annotate_sphere(center, radius=(r, 'kpc'), circle_args={'color':'red'}) c.annotate_sphere(center, radius=(r, 'kpc'), circle_args={'color':'red'})
index = 0 for letter in [a,b,c]: plot = letter.plots[('darkmatter0', 'particle_mass')] plot.figure = fig plot.axes = grid[index].axes plot.cax = grid.cbar_axes[index] letter._setup_plots() index = index + 1
plt.savefig('{}/CatalogProjectionYT_VELA{}_Scale{}.png'.format(out_dir, VELA_number, str(scale)[2:5]), bbox_inches='tight') plt.close() _______________________________________________ yt-users mailing list -- yt-users@python.org To unsubscribe send an email to yt-users-leave@python.org