def plot_bleeds3d(data, template): from mayavi import mlab import datetime from tvtk.util.ctf import PiecewiseFunction, ColorTransferFunction string = str((datetime.datetime.now()).strftime("%d%m%Y_%H%M%S")) otf = PiecewiseFunction() otf.add_point( 0.1, 0.0 ) #opacity values for the boundary elements of the brain...For opaque objects, opacity = 1.0 otf.add_point(5, 0.1) otf.add_point(100, 0.25) ctf = ColorTransferFunction() ctf.add_rgb_point(0, 0, 0, 0) ctf.add_rgb_point(1000, 0.6, 1, 1) #3d plotting mlab.figure(bgcolor=(0, 0, 0), size=(400, 400)) src = mlab.pipeline.scalar_field(template) #voi = mlab.pipeline.extract_grid(src) vol = mlab.pipeline.volume(src) vol._otf = otf vol._volume_property.set_gradient_opacity(otf) vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True src1 = mlab.pipeline.scalar_field(data) voi1 = mlab.pipeline.extract_grid(src1) mlab.pipeline.iso_surface(voi1, color=(1, 0, 0)) mlab.show()
def set_bw_colorscheme(vol, vmin, vmax): ctf = ColorTransferFunction() ctf.add_rgb_point(vmin, 0., 0., 0.) # r, g, and b are float between 0 and 1 ctf.add_rgb_point(vmax, 0., 0., 0.) vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True
def change_volume_property(vol): color1 = [[0,0,0,0,0], [1,255,255,0,10], [10,255,255,0,50], [100,255,100,0,150], [1000,255,0,0,255]] color2 = [[0,0,0,0,0], [100,0,255,255,10], [1000,0,255,255,50], [10000,0,100,255,150], [100000,0,0,255,255]] color = color1 # Changing the ctf: from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() for c in color: ctf.add_rgb_point(c[0], c[1]/255.0, c[2]/255.0, c[3]/255.0) vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True # Changing the otf from enthought.tvtk.util.ctf import PiecewiseFunction otf = PiecewiseFunction() for c in color: otf.add_point(c[0], c[4]/255.0) vol._otf = otf vol._volume_property.set_scalar_opacity(otf)
def ImproveFilterDisplay(): # Changing the ctf: from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() ctf.range = [-1, 1] # Add points to CTF # Note : ctf.add_rgb_point(value, r, g, b) r, g, b are float numbers in [0,1] ctf.add_rgb_point(-1, 0, 0, 1) ctf.add_rgb_point(-0.7, 0, 0, 1) ctf.add_rgb_point(0, 0, 1, 0) ctf.add_rgb_point(0.7, 1, 0, 0) ctf.add_rgb_point(1, 1, 0, 0) # Changing the otf: from tvtk.util.ctf import PiecewiseFunction otf = PiecewiseFunction() # Add points to OTF # Note : otf.add_point(value, opacity) -> opacity is a float number in [0,1] otf.add_point(-1, 0.005) otf.add_point(0, 0.01) otf.add_point(0.6, 0.1) otf.add_point(1, 1) return ctf, otf
def changeVolumeColormap(vol,color): '''change the ctf and otf property of volume Parameters ---------- vol : mlab.volume color : [[]] For each color [datavalue, R, G, B, A] R,G,B,A in range(0.0,255.0) inclusive ''' # Changing the ctf: from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() for c in color: ctf.add_rgb_point(float(c[0]), float(c[1])/255.0, float(c[2])/255.0, float(c[3])/255.0) vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True # Changing the otf from enthought.tvtk.util.ctf import PiecewiseFunction otf = PiecewiseFunction() for c in color: otf.add_point(float(c[0]), float(c[4])/255.0) vol._otf = otf vol._volume_property.set_scalar_opacity(otf)
def _color_im_planes(im_planes): ctf = ColorTransferFunction() ctf.range = (0.0, 1.0) ctf.add_rgb_point(0.0, 1.0, 1.0, 1.0) ctf.add_rgb_point(1.0, 1.0, 0.275, 0.0) for ip in im_planes: lut = ip.module_manager.scalar_lut_manager.lut.table.to_array() for i in xrange(len(lut)): c = 255 * np.asarray(ctf.get_color(float(i) / (len(lut) - 1))) lut[i] = np.concatenate((c, (255,))) ip.module_manager.scalar_lut_manager.lut.table = lut
def _set_cutoff(volume, cutoff): range_min, range_max = volume.current_range otf = PiecewiseFunction() otf.add_point(range_min, 0.0) otf.add_point(range_max, 0.2) volume._otf = otf volume.volume_property.set_scalar_opacity(otf) ctf = ColorTransferFunction() ctf.range = volume.current_range ctf.add_rgb_point(range_min, 1.0, 0.275, 0.0) ctf.add_rgb_point(range_max, 1.0, 0.275, 0.0) volume._ctf = ctf volume.volume_property.set_color(ctf) set_lut(volume.lut_manager.lut, volume.volume_property)
def make_CTF(x1, x2, hue_range=(2.0 / 3.0, 0.0), sat_range=(1.0, 1.0), val_range=(1.0, 1.0), n=10, mode='sqrt'): """Creates a CTF as per given arguments. Lets one set a hue, saturation and value range. The mode can be one of 'sqrt', or 'linear'. The idea of this function is to create a CTF that is similar to the LUT being used. 's_curve' is not implemented. Patches welcome. """ maxs = max(x1, x2) mins = min(x1, x2) ds = maxs - mins dhue = hue_range[1] - hue_range[0] dsat = sat_range[1] - sat_range[0] dval = val_range[1] - val_range[0] ctf = ColorTransferFunction() try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass if mode == 'sqrt': for i in range(n + 1): # Generate x in [0, 1] x = 0.5 * (1.0 + cos((n - i) * pi / n)) # Chebyshev nodes. h = hue_range[0] + dhue * x s = sat_range[0] + dsat * x v = val_range[0] + dval * x r, g, b, a = [sqrt(c) for c in hsva_to_rgba(h, s, v, 1.0)] ctf.add_rgb_point(mins + x * ds, r, g, b) elif mode == 'linear': for i in range(n + 1): # Generate x in [0, 1] x = float(i) / n # Uniform nodes. h = hue_range[0] + dhue * x s = sat_range[0] + dsat * x v = val_range[0] + dval * x r, g, b, a = hsva_to_rgba(h, s, v, 1.0) ctf.add_rgb_point(mins + x * ds, r, g, b) return ctf
def _color_changed(self): if not self.color: return range_min, range_max = self._target.current_range from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() try: ctf.range = (range_min, range_max) except Exception: # VTK versions < 5.2 don't seem to need this. pass r, g, b = self.color ctf.add_rgb_point(range_min, r, g, b) ctf.add_rgb_point(range_max, r, g, b) self._target._ctf = ctf self._target._volume_property.set_color(ctf) self._target.update_ctf = True
def make_CTF(x1, x2, hue_range=(2.0/3.0, 0.0), sat_range=(1.0, 1.0), val_range=(1.0, 1.0), n=10, mode='sqrt'): """Creates a CTF as per given arguments. Lets one set a hue, saturation and value range. The mode can be one of 'sqrt', or 'linear'. The idea of this function is to create a CTF that is similar to the LUT being used. 's_curve' is not implemented. Patches welcome. """ maxs = max(x1, x2) mins = min(x1, x2) ds = maxs - mins dhue = hue_range[1] - hue_range[0] dsat = sat_range[1] - sat_range[0] dval = val_range[1] - val_range[0] ctf = ColorTransferFunction() try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass if mode == 'sqrt': for i in range(n+1): # Generate x in [0, 1] x = 0.5*(1.0 + cos((n-i)*pi/n)) # Chebyshev nodes. h = hue_range[0] + dhue*x s = sat_range[0] + dsat*x v = val_range[0] + dval*x r, g, b, a = [sqrt(c) for c in hsva_to_rgba(h, s, v, 1.0)] ctf.add_rgb_point(mins+x*ds, r, g, b) elif mode == 'linear': for i in range(n+1): # Generate x in [0, 1] x = float(i)/n # Uniform nodes. h = hue_range[0] + dhue*x s = sat_range[0] + dsat*x v = val_range[0] + dval*x r, g, b, a = hsva_to_rgba(h, s, v, 1.0) ctf.add_rgb_point(mins+x*ds, r, g, b) return ctf
def _vmin_changed(self): vmin = self.vmin vmax = self.vmax range_min, range_max = self._target.current_range if vmin is None: vmin = range_min if vmax is None: vmax = range_max # Change the opacity function from tvtk.util.ctf import PiecewiseFunction, save_ctfs otf = PiecewiseFunction() if range_min < vmin: otf.add_point(range_min, 0.) if range_max > vmax: otf.add_point(range_max, 0.2) otf.add_point(vmin, 0.) otf.add_point(vmax, 0.2) self._target._otf = otf self._target._volume_property.set_scalar_opacity(otf) if self.color is None and not self.__ctf_rescaled and \ ( (self.vmin is not None) or (self.vmax is not None) ): # FIXME: We don't use 'rescale_ctfs' because it screws up the nodes. def _rescale_value(x): nx = (x - range_min)/(range_max - range_min) return vmin + nx*(vmax - vmin) # The range of the existing ctf can vary. scale_min, scale_max = self._target._ctf.range def _rescale_node(x): nx = (x - scale_min)/(scale_max - scale_min) return range_min + nx*(range_max - range_min) if hasattr(self._target._ctf, 'nodes'): rgb = list() for value in self._target._ctf.nodes: r, g, b = \ self._target._ctf.get_color(value) rgb.append((_rescale_node(value), r, g, b)) else: rgb = save_ctfs(self._target.volume_property)['rgb'] from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() try: ctf.range = (range_min, range_max) except Exception: # VTK versions < 5.2 don't seem to need this. pass rgb.sort() v = rgb[0] ctf.add_rgb_point(range_min, v[1], v[2], v[3]) for v in rgb: ctf.add_rgb_point(_rescale_value(v[0]), v[1], v[2], v[3]) ctf.add_rgb_point(range_max, v[1], v[2], v[3]) self._target._ctf = ctf self._target._volume_property.set_color(ctf) self.__ctf_rescaled = True self._target.update_ctf = True
def setColormap(self, densityPlot): from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() # Add points to CTF ctf.add_rgb_point(0, 1.0, 1.0, 1.0) ctf.add_rgb_point(0.8, 0.0, 0.0, 1.0) ctf.add_rgb_point(1, 0.0, 0.0, 1.0) densityPlot._volume_property.set_color(ctf) densityPlot.update_ctf = True return densityPlot
def make_volume_prop(mins=255, maxs=355): """Make a volume property for the testing.""" table = tvtk.VolumeProperty() ctf = ColorTransferFunction() ds = (maxs - mins) / 4.0 try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass ctf.add_rgb_point(mins, 0.00, 0.0, 1.00) ctf.add_rgb_point(mins + ds, 0.25, 0.5, 0.75) ctf.add_rgb_point(mins + 2 * ds, 0.50, 1.0, 0.50) ctf.add_rgb_point(mins + 3 * ds, 0.75, 0.5, 0.25) ctf.add_rgb_point(maxs, 1.00, 0.0, 0.00) otf = PiecewiseFunction() otf.add_point(mins, 0.0) otf.add_point(maxs, 0.2) table.set_color(ctf) table.set_scalar_opacity(otf) return table, ctf, otf
def NewColorMap(h): ctf = ColorTransferFunction() otf = PiecewiseFunction() ctf.remove_all_points() otf.remove_all_points() ctf.add_rgb_point(0, 1, 1, 1) otf.add_point(0, 0) for i in range(128): q = (i + 1.0) / 128.0 ctf.add_rgb_point(-q, 1 - q * q, 1 - q * q, 1) # -1 --> blue, 0 --> white, 1-->red ctf.add_rgb_point(q, 1, 1 - q * q, 1 - q * q) otf.add_point(-q, 0.5 * q) otf.add_point(q, 0.5 * q) ctf.range = [-1, 1] h._volume_property.set_color(ctf) h._ctf = ctf h.update_ctf = True h._otf = otf h._volume_property.set_scalar_opacity(otf)
def make_volume_prop(mins=255, maxs=355): """Make a volume property for the testing.""" table = tvtk.VolumeProperty() ctf = ColorTransferFunction() ds = (maxs-mins)/4.0 try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass ctf.add_rgb_point(mins, 0.00, 0.0, 1.00) ctf.add_rgb_point(mins+ds, 0.25, 0.5, 0.75) ctf.add_rgb_point(mins+2*ds, 0.50, 1.0, 0.50) ctf.add_rgb_point(mins+3*ds, 0.75, 0.5, 0.25) ctf.add_rgb_point(maxs, 1.00, 0.0, 0.00) otf = PiecewiseFunction() otf.add_point(mins, 0.0) otf.add_point(maxs, 0.2) table.set_color(ctf) table.set_scalar_opacity(otf) return table, ctf, otf
def volume(sim, qty='rho', width=None, resolution=200, color=(1.0,1.0,1.0),vmin=None,vmax=None, dynamic_range=4.0,log=True, create_figure=True): """Create a volume rendering of the given simulation using mayavi. **Keyword arguments:** *qty* (rho): The name of the array to interpolate *width* (None): The width of the cube to generate, centered on the origin *resolution* (200): The number of elements along each side of the cube *color* (white): The color of the volume rendering. The value of each voxel is used to set the opacity. *vmin* (None): The value for zero opacity (calculated using dynamic_range if None) *vmax* (None): The value for full opacity (calculated from the maximum value in the region if None) *dynamic_range*: The dynamic range to use if vmin and vmax are not specified *log* (True): log-scale the image before passing to mayavi *create_figure* (True): create a new mayavi figure before rendering """ import mayavi from mayavi import mlab from tvtk.util.ctf import PiecewiseFunction, ColorTransferFunction if create_figure: fig = mlab.figure(size=(500,500),bgcolor=(0,0,0)) grid_data = sph.to_3d_grid(sim,qty=qty,nx=resolution, x2=None if width is None else width/2) if log: grid_data = np.log10(grid_data) if vmin is None: vmin = grid_data.max()-dynamic_range if vmax is None: vmax = grid_data.max() else: if vmin is None: vmin = np.min(grid_data) if vmax is None: vmax = np.max(grid_data) grid_data[grid_data<vmin]=vmin grid_data[grid_data>vmax]=vmax otf = PiecewiseFunction() otf.add_point(vmin,0.0) otf.add_point(vmax,1.0) sf = mayavi.tools.pipeline.scalar_field(grid_data) V = mlab.pipeline.volume(sf,color=color,vmin=vmin,vmax=vmax) V.trait_get('volume_mapper')['volume_mapper'].blend_mode = 'maximum_intensity' if color is None: ctf = ColorTransferFunction() ctf.add_rgb_point(vmin,107./255,124./255,132./255) ctf.add_rgb_point(vmin+(vmax-vmin)*0.8,200./255,178./255,164./255) ctf.add_rgb_point(vmin+(vmax-vmin)*0.9,1.0,210./255,149./255) ctf.add_rgb_point(vmax,1.0,222./255,141./255) print vmin,vmax V._volume_property.set_color(ctf) V._ctf = ctf V.update_ctf = True V._otf = otf V._volume_property.set_scalar_opacity(otf) return V
def volume(sim, qty='rho', width=None, resolution=200, color=(1.0, 1.0, 1.0), vmin=None, vmax=None, dynamic_range=4.0, log=True, create_figure=True): """Create a volume rendering of the given simulation using mayavi. **Keyword arguments:** *qty* (rho): The name of the array to interpolate *width* (None): The width of the cube to generate, centered on the origin *resolution* (200): The number of elements along each side of the cube *color* (white): The color of the volume rendering. The value of each voxel is used to set the opacity. *vmin* (None): The value for zero opacity (calculated using dynamic_range if None) *vmax* (None): The value for full opacity (calculated from the maximum value in the region if None) *dynamic_range*: The dynamic range to use if vmin and vmax are not specified *log* (True): log-scale the image before passing to mayavi *create_figure* (True): create a new mayavi figure before rendering """ import mayavi from mayavi import mlab from tvtk.util.ctf import PiecewiseFunction, ColorTransferFunction if create_figure: fig = mlab.figure(size=(500, 500), bgcolor=(0, 0, 0)) grid_data = sph.to_3d_grid(sim, qty=qty, nx=resolution, x2=None if width is None else width / 2) if log: grid_data = np.log10(grid_data) if vmin is None: vmin = grid_data.max() - dynamic_range if vmax is None: vmax = grid_data.max() else: if vmin is None: vmin = np.min(grid_data) if vmax is None: vmax = np.max(grid_data) grid_data[grid_data < vmin] = vmin grid_data[grid_data > vmax] = vmax otf = PiecewiseFunction() otf.add_point(vmin, 0.0) otf.add_point(vmax, 1.0) sf = mayavi.tools.pipeline.scalar_field(grid_data) V = mlab.pipeline.volume(sf, color=color, vmin=vmin, vmax=vmax) V.trait_get( 'volume_mapper')['volume_mapper'].blend_mode = 'maximum_intensity' if color is None: ctf = ColorTransferFunction() ctf.add_rgb_point(vmin, 107. / 255, 124. / 255, 132. / 255) ctf.add_rgb_point(vmin + (vmax - vmin) * 0.8, 200. / 255, 178. / 255, 164. / 255) ctf.add_rgb_point(vmin + (vmax - vmin) * 0.9, 1.0, 210. / 255, 149. / 255) ctf.add_rgb_point(vmax, 1.0, 222. / 255, 141. / 255) print vmin, vmax V._volume_property.set_color(ctf) V._ctf = ctf V.update_ctf = True V._otf = otf V._volume_property.set_scalar_opacity(otf) return V
def _vmin_changed(self): vmin = self.vmin vmax = self.vmax range_min, range_max = self._target.current_range if vmin is None: vmin = range_min if vmax is None: vmax = range_max # Change the opacity function from tvtk.util.ctf import PiecewiseFunction, save_ctfs otf = PiecewiseFunction() if range_min < vmin: otf.add_point(range_min, 0.) if range_max > vmax: otf.add_point(range_max, 0.2) otf.add_point(vmin, 0.) otf.add_point(vmax, 0.2) self._target._otf = otf self._target._volume_property.set_scalar_opacity(otf) if self.color is None and \ ((self.vmin is not None) or (self.vmax is not None)): # FIXME: We don't use 'rescale_ctfs' because it screws up the # nodes, this is because, the values are actually scaled between # the specified vmin/vmax and NOT the full range of values # specified in the CTF or in the volume object. if self.__last_vrange: last_min, last_max = self.__last_vrange else: last_min, last_max = range_min, range_max def _rescale_value(x): nx = (x - last_min) / (last_max - last_min) return vmin + nx * (vmax - vmin) # For some reason on older versions of VTK (< 8.1 at least), # The range trait is not updated correctly when the rgb points # are added, this causes problems so we explicitly update them. self._target._ctf.update_traits() scale_min, scale_max = self._target._ctf.range def _rescale_node(x): nx = (x - scale_min) / (scale_max - scale_min) return range_min + nx * (range_max - range_min) if hasattr(self._target._ctf, 'nodes'): rgb = list() for value in self._target._ctf.nodes: r, g, b = \ self._target._ctf.get_color(value) rgb.append((_rescale_node(value), r, g, b)) else: rgb = save_ctfs(self._target.volume_property)['rgb'] from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() try: ctf.range = (range_min, range_max) except Exception: # VTK versions < 5.2 don't seem to need this. pass rgb.sort() v = rgb[0] ctf.add_rgb_point(range_min, v[1], v[2], v[3]) for v in rgb: ctf.add_rgb_point(_rescale_value(v[0]), v[1], v[2], v[3]) ctf.add_rgb_point(range_max, v[1], v[2], v[3]) self._target._ctf = ctf self._target._volume_property.set_color(ctf) self.__last_vrange = vmin, vmax self._target.update_ctf = True
from tvtk.util.ctf import PiecewiseFunction f2 = TFile("dose.root") A = f2.Get("pRad1") histA = r2m.Hist2D(A) histA = np.array(histA.content) histA = np.clip(histA, 290, 330) histA = histA[150:850, 150:850] f = TFile("CIRSHead.root") HU = f.Get("hu") print HU.GetNbinsX(), HU.GetNbinsY(), HU.GetNbinsZ() n = [HU.GetNbinsX(), HU.GetNbinsY(), HU.GetNbinsZ()] n2 = (n[0] + 2) * (n[1] + 2) * (n[2] + 2) d = HU.GetArray() d.SetSize(n2) ctf = ColorTransferFunction() ctf.add_rgb_point(0.5, 1, 1, 1) # r, g, and b are float # between 0 and 1 otf = PiecewiseFunction() otf.add_point(-110, 0.0) otf.add_point(-105, 1.0) otf.add_point(128, 1.0) #D = np.array(d).reshape(282,258,258) D = np.array(d).reshape(280 + 2, 512 + 2, 512 + 2) #D = D[80:270,37:210,64:193] X, Y, Z = np.where(D) mlab.figure(bgcolor=(0, 0, 0), size=(400, 400)) vol = mlab.pipeline.volume(mlab.pipeline.scalar_field(D, opacity=1.0), vmin=-60,
def volume_red_blue(scalar_field, scalar_data): minr = scalar_data.min() maxr = scalar_data.max() #Volume for high pressure rvmin1 = minr + 0.5 * (maxr - minr) rvmax1 = minr + 1. * (maxr - minr) rvol1 = mlab.pipeline.volume(scalar_field, vmin=rvmin1, vmax=rvmax1) # Changing the ctf: from tvtk.util.ctf import ColorTransferFunction ctf1 = ColorTransferFunction() ctf1.add_rgb_point(rvmin1, 1., 1., 0.5) ctf1.add_rgb_point(rvmin1 + 0.4 * (rvmax1 - rvmin1), 1, 0.3, 0.1) ctf1.add_rgb_point(rvmax1, 1., 0., 0.) # ... rvol1._volume_property.set_color(ctf1) rvol1._ctf = ctf1 rvol1.update_ctf = True #Changing the opacity of the volume vol1 ## Changing the otf: from tvtk.util.ctf import PiecewiseFunction otf = PiecewiseFunction() otf.add_point(rvmin1, 0) otf.add_point(rvmin1 + (rvmax1 - rvmin1) * 0.2, 0.012) otf.add_point(rvmin1 + (rvmax1 - rvmin1) * 0.5, 0.05) otf.add_point(rvmax1, 0.15) ##vol1._otf = otf rvol1._volume_property.set_scalar_opacity(otf) # exempt volume from shading and improve overall look by increasing opacity rvol1.volume_property.shade = False rvol1.volume_property.scalar_opacity_unit_distance = 2.0 #Volume for low pressure rvmin2 = minr + 0. * (maxr - minr) rvmax2 = minr + 0.5 * (maxr - minr) rvol2 = mlab.pipeline.volume(scalar_field, vmin=rvmin2, vmax=rvmax2) # Changing the ctf: ctf2 = ColorTransferFunction() ctf2.add_rgb_point(rvmin2, 0., 0.5, 1.) ctf2.add_rgb_point(rvmin2 + 0.6 * (rvmax2 - rvmin2), 0.1, 0.7, 1.) ctf2.add_rgb_point(rvmax2, 0.5, 1., 1.) # ... rvol2._volume_property.set_color(ctf2) rvol2._ctf = ctf2 rvol2.update_ctf = True #Changing the opacity of the volume vol2 ## Changing the otf: otf = PiecewiseFunction() otf.add_point(rvmax2, 0) otf.add_point(rvmax2 - (rvmax2 - rvmin2) * 0.2, 0.012) otf.add_point(rvmax2 - (rvmax2 - rvmin2) * 0.5, 0.05) otf.add_point(rvmin2, 0.15) ##vol1._otf = otf rvol2._volume_property.set_scalar_opacity(otf) # exempt volume from shading and improve overall look by increasing opacity rvol2.volume_property.shade = False rvol2.volume_property.scalar_opacity_unit_distance = 2.0
# compensate for huge outliers which would screw up the color map cutoff = np.percentile(data, args.cutoff) data[data > cutoff] = cutoff mx = np.max(data) mn = np.min(data) data = ((data - mn) / (mx - mn)).astype(np.float32) print("done") volume_figure = mlab.figure(bgcolor=(1, 1, 1), fgcolor=(0, 0, 0)) vol = mlab.pipeline.volume(mlab.pipeline.scalar_field(data), vmin=args.vmin, vmax=args.vmax) ctf = ColorTransferFunction() ctf.add_rgb_point(0, 1, 1, 1) ctf.add_rgb_point(1, 0, 0, 0.3) vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True mlab.outline() if args.show_cut: cut_figure = mlab.figure(bgcolor=(1, 1, 1), fgcolor=(0, 0, 0)) mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(data), plane_orientation='x_axes', slice_index=data.shape[0] / 2, figure=cut_figure) mlab.sync_camera(volume_figure, cut_figure) mlab.outline()
def volume_red_blue(scalar_field, scalar_data): minr = scalar_data.min() maxr = scalar_data.max() # max and mins rvmin_pos = minr + 0.5 * (maxr - minr) rvmax_pos = minr + 1. * (maxr - minr) rvmin_neg = minr + 0. * (maxr - minr) rvmax_neg = minr + 0.5 * (maxr - minr) rvol = mlab.pipeline.volume(scalar_field, vmin=rvmin_neg, vmax=rvmax_pos) # Changing the ctf: from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() ctf.add_rgb_point(rvmin_pos, 1., 1., 0.5) ctf.add_rgb_point(rvmin_pos + 0.4 * (rvmax_pos - rvmin_pos), 1, 0.3, 0.1) ctf.add_rgb_point(rvmax_pos, 1., 0., 0.) ctf.add_rgb_point(rvmin_neg, 0., 0.5, 1.) ctf.add_rgb_point(rvmin_neg + 0.6 * (rvmax_neg - rvmin_neg), 0.1, 0.7, 1.) ctf.add_rgb_point(rvmax_neg, 0.5, 1., 1.) rvol._volume_property.set_color(ctf) rvol._ctf = ctf rvol.update_ctf = True #Changing the opacity of the volume vol ## Changing the otf: from tvtk.util.ctf import PiecewiseFunction otf = PiecewiseFunction() otf.add_point(rvmin_pos, 0) otf.add_point(rvmin_pos + (rvmax_pos - rvmin_pos) * 0.2, 0.012) otf.add_point(rvmin_pos + (rvmax_pos - rvmin_pos) * 0.5, 0.05) otf.add_point(rvmax_pos, 0.15) otf.add_point(rvmax_neg, 0) otf.add_point(rvmax_neg - (rvmax_neg - rvmin_neg) * 0.2, 0.012) otf.add_point(rvmax_neg - (rvmax_neg - rvmin_neg) * 0.5, 0.05) otf.add_point(rvmin_neg, 0.15) ##vol1._otf = otf rvol._volume_property.set_scalar_opacity(otf) # exempt volume from shading and improve overall look by increasing opacity rvol.volume_property.shade = False rvol.volume_property.scalar_opacity_unit_distance = 2.0
import numpy as np import h5py from mayavi import mlab from tvtk.util.ctf import ColorTransferFunction from tvtk.util.ctf import PiecewiseFunction filename = 'Ezdata2.h5' f = h5py.File(filename, 'r') filename = 'Ezdata.h5' f_p = h5py.File(filename, 'r') #just plane wave ctf = ColorTransferFunction() ctf.add_rgb_point(1, 1, 0, 0) # ctf.add_rgb_point(1, 0, 0, 1) # Changing the otf: otf = PiecewiseFunction() # for i in range(101): # otf.add_point(i/100, np.sqrt(np.sqrt(i/100))) # otf2 = PiecewiseFunction() for i in range(101): otf.add_point(i / 100.0, (i / 100.0)**(0.7)) for i in [30, 65, 85]: mlab.figure(size=(800, 799), bgcolor=(1, 1, 1)) x, y, z = np.mgrid[0:99, 0:99, 0:100] data = np.array(f[f.keys()[i]]) #scattered wave data2 = np.array(f_p[f_p.keys()[i]]) #plane wave data2[:, :, :] = 0 # data2=np.abs(data2-data) # m=np.amax(data) m = np.amax(data)
def potential3d(self, mode='', export_figure=True): """ Creates a 3D interactive ESP potential plot. :param mode: mode of the plot: '', 'iso_surface', 'contour' :param export_figure: boolean, whether to save an image or not :raises: ValueError when the visualization mode is invalid """ from mayavi import mlab potential = self.electron_potential if mode == '': grid = mlab.pipeline.scalar_field(potential) min = potential.min() negative_steps = np.percentile(potential[potential < 0], [2.0, 3.0, 7.5]) positive_steps = np.percentile(potential[potential > 0], [92.5, 97.0, 98.0]) max = potential.max() vol = mlab.pipeline.volume(grid, vmin=min, vmax=max) from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() ctf.add_rgb_point(min, 1, 0.3, 0.3) # numbers are r,g,b in [0;1] ctf.add_rgb_point(negative_steps[1], 1, 0.3, 0.3) ctf.add_rgb_point(negative_steps[2], 1, 1, 1) ctf.add_rgb_point(positive_steps[0], 1, 1, 1) ctf.add_rgb_point(positive_steps[1], 0.3, 0.3, 1) ctf.add_rgb_point(max, 0.3, 0.3, 1) ctf.range = np.asarray([min, max]) vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True # Changing the otf: from tvtk.util.ctf import PiecewiseFunction otf = PiecewiseFunction() otf.add_point(min, 1.0) otf.add_point(negative_steps[1], 1.0) otf.add_point(negative_steps[2], 0.0) otf.add_point(positive_steps[0], 0.0) otf.add_point(positive_steps[1], 1.0) otf.add_point(max, 1.0) vol._otf = otf vol._volume_property.set_scalar_opacity(otf) mlab.axes() elif mode == 'iso_surface': source = mlab.pipeline.scalar_field(potential) clip = mlab.pipeline.data_set_clipper(source) mlab.pipeline.iso_surface(clip) elif mode == 'contour': n = self.electron_potential.shape[0] range = 100 x, y, z = np.mgrid[-range / 2:range / 2:complex(n), -range / 2:range / 2:complex(n), -range / 2:range / 2:complex(n)] mlab.contour3d(x, y, z, self.electron_potential, contours=10, opacity=0.5) else: log.error("The visualisation mode of the electrostatic potential" " can be one of ['', 'iso_surface', 'contour']") raise ValueError if export_figure: mlab.savefig(filename=os.path.join( self.figures_dir, '{0}_elstpot3d.png'.format( self.molecule_name))) mlab.show()
position2=[0.11,0.31]) mpf.change_surface_scalars(new_tube, surf_bar_label, 'vphi', lim=1.5) new_tube.parent.scalar_lut_manager.label_text_property.color = (1,1,1) slines.parent.scalar_lut_manager.number_of_labels = 4 surf_bar_label.property.color = text_color surf_bar_label.y_position = 0.05 surf_bar_label.x_position = 0.93 # Add GBand volume render vol = mlab.pipeline.volume(gband) vol.volume.mapper.blend_mode = 'maximum_intensity' #vol.volume.mapper.number_of_threads = 16 # Make a decent ctf and otf ctf = ColorTransferFunction() ctf.range = [0.1, 1] ctf.add_rgb_point(1, 1., 1, 0.01) ctf.add_rgb_point(0.85, 1., 0.8, 0.) ctf.add_rgb_point(0.6, 0.9, 0.3, 0.) ctf.add_rgb_point(0.4, 0.8, 0.0, 0.) ctf.add_rgb_point(0., 0.01, 0., 0.) otf = PiecewiseFunction() otf.add_point(1., 1.) otf.add_point(0.6, 0.9) otf.add_point(0.2, 0.) otf.add_point(0., 0.) vol._volume_property.set_color(ctf) vol._ctf = ctf vol._otf = otf vol._volume_property.set_scalar_opacity(otf)