pythonnumpymatplotlibcolorbaryt-project

How can I set the colorbar limits for a yt.SlicePlot using set_cmap?


I am totally new to Python and I am totally lost. My supervisor helped me to generate a script to see some slices of a 3D velocity model:

import numpy as np
import matplotlib.pyplot as plt
import yt
from yt.units import km

#Import et reshape data
d = np.genfromtxt('velocity_model.txt', delimiter=' ')
nd=22
nx=131
vel = d[:,3].reshape(nd,nx,nx)
lat = d[:,0].reshape(nd,nx,nx)
lon = d[:,1].reshape(nd,nx,nx)
dep = d[:,2].reshape(nd,nx,nx)
# When this is read into YT, depth increases along x axis, longitude increases along y axis and latitude increases along z axis, need to swap x and z and then flip z
dep=dep.swapaxes(0,2) # swap first and third dimensions: gives lon (x), lat (y), depth (z)
vel=vel.swapaxes(0,2) # swap first and third dimensions: 
lat=lat.swapaxes(0,2) # swap first and third dimensions: 
lon=lon.swapaxes(0,2) # swap first and third dimensions: 
dep=dep[:,:,::-1] # reverse z direction
vel=vel[:,:,::-1] # swap first and 2nd dimensions: 
lat=lat[:,:,::-1] # swap first and 2nd dimensions: 
lon=lon[:,:,::-1] # swap first and 2nd dimensions: 
xmin=0
xmax=289
ymin=0
ymax=289
zmin=-100
zmax=5

#Entrer dans YT
data=dict(velocity=(vel,'km/s'),latitude=(lat,'deg'),longitude=(lon,'deg'),depth=(dep,'km'))
bbox = np.array([[xmin,xmax], [ymin,ymax], [zmin,zmax]])
ds=yt.load_uniform_grid(data,vel.shape, length_unit='km', bbox=bbox)

#Off-Axis Slice
for key in ['latitude','longitude','depth','velocity'] :
     L = [0,0,1] # cutting plane=z
     slicepos=-50
     c = [(xmax-xmin)/2, (ymax-ymin)/2, slicepos]
     cut = yt.SlicePlot(ds, L, key,origin='native',center=c) #, width=(200,90,'km'))
     cut.set_log(key, False)
     cut.annotate_text([0.5,0.9],'z={:d} km'.format(slicepos),coord_system='axis')
     cut.set_cmap(field='velocity',cmap='jet_r')
     cut.save()

With this script, I would like to fix the colorbar, because for each image this one change, and it's not easy to interpret like this.

I tried to add limits like this:

h=colorbar
h.Limits = [5 9]
cut.set_cmap(field='velocity',cmap='jet_r', h)

But it's not the good way. Does someone have an idea? I saw lot of things but not for cmap.


Solution

  • This is really a question about the yt visualization library rather than matplotlib per se - I've edited the title and tags to reflect this.

    I have never come across yt before, but based on the official documentation for yt.SlicePlot, it seems that cut will either be an AxisAlignedSlicePlot or an OffAxisSlicePlot object. Both of these classes have a .set_zlim() method that seems to do what you want:

    AxisAlignedSlicePlot.set_zlim(*args, **kwargs)

    set the scale of the colormap

    Parameters:

    • field : string

      the field to set a colormap scale if field == ‘all’, applies to all plots.

    • zmin : float

      the new minimum of the colormap scale. If ‘min’, will set to the minimum value in the current view.

    • zmax : float

      the new maximum of the colormap scale. If ‘max’, will set to the maximum value in the current view.

    Other Parameters:

    • dynamic_range : float (default: None)

      The dynamic range of the image. If zmin == None, will set zmin = zmax / dynamic_range If zmax == None, will set zmax = zmin * dynamic_range. When dynamic_range is specified, defaults to setting zmin = zmax / dynamic_range.

    In other words, you could probably use:

    cut.set_zlim(field='velocity', zmin=5, zmax=9)