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 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 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 _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 _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 _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 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 plot_volume(x, y, z, s, logplot=False, **kwargs): if (logplot): maxval = log(abs(s).max()) minval = maxval - logrange logs = log(abs(s)) logs = where(logs > minval, logs - minval, 0) logs /= logs.max() src = mlab.pipeline.scalar_field(x, y, z, logs) else: maxval = abs(s).max() src = mlab.pipeline.scalar_field(x, y, z, abs(s) / maxval) vol = mlab.pipeline.volume(src) ctf = ColorTransferFunction() ctf.range = [0, 1] otf = PiecewiseFunction() otf.add_point((0, 0)) otf.add_point((1, 1)) otf.range = [0, 1] vol.otf = otf vol.volume_property.set_scalar_opacity(otf) return vol
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 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 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 ImproveDataDisplay(): # Changing the ctf: from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() ctf.range = [0, 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(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(0, 0.015) otf.add_point(0.2, 1) otf.add_point(1, 1) return ctf, otf
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 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
def td(ty,t,E,rho,sigma,wdir): D = pp.pload(t,w_dir=wdir) if ty == 'flux': for k in range(D.rho.shape[2]): for j in range(D.rho.shape[1]): for i in range(D.rho.shape[0]): # if (i-D.rho.shape[0]/2)**2+(j-D.rho.shape[1]/2)**2+(k-D.rho.shape[2]/2)**2 > 30**2: # D.rho[k,j,i] = rho if D.rho[k,j,i] > 10: D.rho[k,j,i] = rho flux = D.rho*(D.bx1**2+D.bx2**2+D.bx3**2)**1.25*(D.vx1**2+D.vx2**2+D.vx3**2)**0 flux = (flux-np.mean(flux))*1+np.mean(flux)*1 flux = flux.sum(axis=0) flux = nd.gaussian_filter(flux,sigma=(sigma,sigma),order=0) fig = plt.figure(figsize=(7,6)) ax = fig.add_subplot(111) neg = ax.imshow(np.log10(flux).T,origin='lower',extent=[D.x2[0],D.x2[-1],D.x3[0],D.x3[-1]]) levels = np.arange(-5.5, -4, 0.5) plt.contour(np.log10(flux).T, levels, origin='lower', linewidths=2, extent=[D.x1[0],D.x1[-1],D.x2[0],D.x2[-1]]) cbar = fig.colorbar(neg,ax=ax) cbar.set_label(r'log(S)') ax.set_xlabel('l offset (pc)') ax.set_ylabel('b offset (pc)') ax.set_title(r't='+str(t)+r'$\ \mathregular{\rho}$='+str(rho)+' E='+str(E)) fig.subplots_adjust(top=0.9,bottom=0.1,left=0.11,right=0.97) fig.savefig('t'+str(t)+'_density'+str(rho)+'_E'+str(E)+'.eps') fig.clear() ax = fig.add_subplot(111) ax.plot((np.rot90(np.eye(len(flux)))*flux.T).sum(axis=0)) ax.set_xlim(0,256) fig.savefig('change.eps') elif ty == 'rho': # t = 850 fig = plt.figure(figsize=(7,6)) ax = fig.add_subplot(111) neg = ax.imshow(np.log10(D.rho[:,:,128]).T,origin='lower',extent=[D.x2[0],D.x2[-1],D.x3[0],D.x3[-1]]) cbar = fig.colorbar(neg,ax=ax) cbar.set_label(r'log($\mathregular{\rho/cm^{-3}}$)') ax.set_xlabel('x offset (pc)') ax.set_ylabel('y offset (pc)') ax.set_title(r't='+str(t)+r'$\ \mathregular{\rho}$='+str(rho)+' E='+str(E)) fig.subplots_adjust(top=0.9,bottom=0.1,left=0.11,right=0.97) T = pp.Tools() newdims = 2*(20,) Xmesh, Ymesh = np.meshgrid(D.x2.T,D.x3.T) xcong = T.congrid(Xmesh,newdims,method='linear') ycong = T.congrid(Ymesh,newdims,method='linear') velxcong = T.congrid(D.bx1[:,:,128].T,newdims,method='linear') velycong = T.congrid(D.bx2[:,:,128].T,newdims,method='linear') plt.gca().quiver(xcong, ycong, velxcong, velycong,color='w') plt.show() fig.savefig('rho-t='+str(t)+'_density='+str(rho)+'_E='+str(E)+'.eps') # Only to be saved as either .png or .jpg # close() else: print(D.x1.shape) # arr = np.meshgrid(D.x1,D.x2,D.x3) # mlab.points3d(arr[0][0:256:8,0:256:8,0:256:8], arr[1][0:256:8,0:256:8,0:256:8], arr[2][0:256:8,0:256:8,0:256:8], D.rho[0:256:8,0:256:8,0:256:8]) vol = mlab.pipeline.volume(mlab.pipeline.scalar_field(np.log10(D.prs*D.rho))) ctf = ColorTransferFunction() ctf.add_hsv_point(-8, 0.8, 1, 1) ctf.add_hsv_point(-6.5, 0.45, 1, 1) ctf.add_hsv_point(-5.4, 0.15, 1, 1) vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True otf = PiecewiseFunction() otf.add_point(-8, 0) otf.add_point(-5.7, 0.082) otf.add_point(-5.4, 0.0) vol._otf = otf vol._volume_property.set_scalar_opacity(otf)
new_tube, surf_bar, surf_bar_label = mpf.draw_surface(surf_poly,'RdBu',lim=0.4, position=[0.81, 0.1], 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
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_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)
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()
def td(ty, t, E, rho, sigma, wdir): D = pp.pload(t, w_dir=wdir) if ty == 'flux': for k in range(D.rho.shape[2]): for j in range(D.rho.shape[1]): for i in range(D.rho.shape[0]): # if (i-D.rho.shape[0]/2)**2+(j-D.rho.shape[1]/2)**2+(k-D.rho.shape[2]/2)**2 > 30**2: # D.rho[k,j,i] = rho if D.rho[k, j, i] > 10: D.rho[k, j, i] = rho flux = D.rho * (D.bx1**2 + D.bx2**2 + D.bx3**2)**1.25 * (D.vx1**2 + D.vx2**2 + D.vx3**2)**0 flux = (flux - np.mean(flux)) * 1 + np.mean(flux) * 1 flux = flux.sum(axis=0) flux = nd.gaussian_filter(flux, sigma=(sigma, sigma), order=0) fig = plt.figure(figsize=(7, 6)) ax = fig.add_subplot(111) neg = ax.imshow(np.log10(flux).T, origin='lower', extent=[D.x2[0], D.x2[-1], D.x3[0], D.x3[-1]]) levels = np.arange(-5.5, -4, 0.5) plt.contour(np.log10(flux).T, levels, origin='lower', linewidths=2, extent=[D.x1[0], D.x1[-1], D.x2[0], D.x2[-1]]) cbar = fig.colorbar(neg, ax=ax) cbar.set_label(r'log(S)') ax.set_xlabel('l offset (pc)') ax.set_ylabel('b offset (pc)') ax.set_title(r't=' + str(t) + r'$\ \mathregular{\rho}$=' + str(rho) + ' E=' + str(E)) fig.subplots_adjust(top=0.9, bottom=0.1, left=0.11, right=0.97) fig.savefig('t' + str(t) + '_density' + str(rho) + '_E' + str(E) + '.eps') fig.clear() ax = fig.add_subplot(111) ax.plot((np.rot90(np.eye(len(flux))) * flux.T).sum(axis=0)) ax.set_xlim(0, 256) fig.savefig('change.eps') elif ty == 'rho': # t = 850 fig = plt.figure(figsize=(7, 6)) ax = fig.add_subplot(111) neg = ax.imshow(np.log10(D.rho[:, :, 128]).T, origin='lower', extent=[D.x2[0], D.x2[-1], D.x3[0], D.x3[-1]]) cbar = fig.colorbar(neg, ax=ax) cbar.set_label(r'log($\mathregular{\rho/cm^{-3}}$)') ax.set_xlabel('x offset (pc)') ax.set_ylabel('y offset (pc)') ax.set_title(r't=' + str(t) + r'$\ \mathregular{\rho}$=' + str(rho) + ' E=' + str(E)) fig.subplots_adjust(top=0.9, bottom=0.1, left=0.11, right=0.97) T = pp.Tools() newdims = 2 * (20, ) Xmesh, Ymesh = np.meshgrid(D.x2.T, D.x3.T) xcong = T.congrid(Xmesh, newdims, method='linear') ycong = T.congrid(Ymesh, newdims, method='linear') velxcong = T.congrid(D.bx1[:, :, 128].T, newdims, method='linear') velycong = T.congrid(D.bx2[:, :, 128].T, newdims, method='linear') plt.gca().quiver(xcong, ycong, velxcong, velycong, color='w') plt.show() fig.savefig('rho-t=' + str(t) + '_density=' + str(rho) + '_E=' + str(E) + '.eps') # Only to be saved as either .png or .jpg # close() else: print(D.x1.shape) # arr = np.meshgrid(D.x1,D.x2,D.x3) # mlab.points3d(arr[0][0:256:8,0:256:8,0:256:8], arr[1][0:256:8,0:256:8,0:256:8], arr[2][0:256:8,0:256:8,0:256:8], D.rho[0:256:8,0:256:8,0:256:8]) vol = mlab.pipeline.volume( mlab.pipeline.scalar_field(np.log10(D.prs * D.rho))) ctf = ColorTransferFunction() ctf.add_hsv_point(-8, 0.8, 1, 1) ctf.add_hsv_point(-6.5, 0.45, 1, 1) ctf.add_hsv_point(-5.4, 0.15, 1, 1) vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True otf = PiecewiseFunction() otf.add_point(-8, 0) otf.add_point(-5.7, 0.082) otf.add_point(-5.4, 0.0) vol._otf = otf vol._volume_property.set_scalar_opacity(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 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
from matplotlib import pyplot as plt 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),