2

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.

ali_m
  • 71,714
  • 23
  • 223
  • 298
OcéF
  • 47
  • 8
  • You should mention in your question that you are using the [yt visualization library](http://yt-project.org/) rather than plain matplotlib. It's not immediately clear what `yt.SlicePlot` does. – ali_m May 09 '16 at 15:25

2 Answers2

2

You're looking for the set_zlim function:

http://yt-project.org/doc/reference/api/generated/yt.visualization.plot_window.AxisAlignedSlicePlot.set_zlim.html

The set_cmap function just allows you to choose which colormap you want, it does not allow you to set the colormap range. You need to use set_zlim for that. Here's an example, using one of the sample datasets from http://yt-project.org/data:

import yt
ds = yt.load('IsolatedGalaxy/galaxy0030/galaxy0030')
plot = yt.SlicePlot(ds, 2, 'density')
plot.set_cmap('density', 'viridis')
plot.set_zlim('density', 1e-28, 1e-25)

This produces the following image:

enter image description here

ngoldbaum
  • 5,430
  • 3
  • 28
  • 35
1

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)
ali_m
  • 71,714
  • 23
  • 223
  • 298