def _update_radius(self, timepoint=None): """Update marker's radius.""" logger.debug("Weird edge arround markers (source_obj.py)") if not hasattr(self, 'radius'): if np.unique(self._data).size == 1: self.radius = self._radius_min * np.ones((len(self, ))) else: self.radius = normalize(self._data.copy(), tomin=self._radius_min, tomax=self._radius_max) if timepoint: self._sources._data['a_size'] = self.radius[:, int( timepoint)] # fs/time if not hasattr(self, '_timer'): self._timer = visuals.Text(str(int(timepoint)), pos=[0, 100, 0], bold=True, name='Text', color=color2vb('white'), font_size=50, parent=None) #self._node) self._timer.text = str(int(timepoint)) self._timer.update() else: if len(self.radius.shape) == 2: self._sources._data['a_size'] = np.mean(self.radius, axis=1) else: self._sources._data['a_size'] = self.radius to_hide = self.hide # Marker size + egde width = 0 and text='' for hidden sources : self._sources._data['a_size'][to_hide] = 0. self._sources._data['a_edgewidth'][to_hide] = 0. if isinstance(self._mask_radius, (int, float)): self._sources._data['a_size'][self._mask] = self._mask_radius text = np.array(self._text.copy()) text[to_hide] = '' self._sources_text.text = text self.update()
def add_overlay(self, data, vertices=None, to_overlay=None, mask_data=None, **kwargs): """Add an overlay to the mesh. Note that the current implementation limit to a number of of four overlays. Parameters ---------- data : array_like Array of data of shape (n_data,). vertices : array_like | None The vertices to color with the data of shape (n_data,). to_overlay : int | None Add data to a specific overlay. This parameter must be a integer. mask_data : array_like | None Array to specify if some vertices have to be considered as masked (and use the `mask_color` color) kwargs : dict | {} Additional color color properties (cmap, clim, vmin, vmax, under, over, translucent) """ # Check input variables : if vertices is None: vertices = np.ones((len(self), ), dtype=bool) # Send data to the mask : if isinstance(mask_data, np.ndarray) and len(mask_data) == len(self): self._bgd_data[mask_data] = .5 self._bgd_buffer.set_data(self._bgd_data) if not len(vertices): logger.warning('Vertices array is empty. Abandoning.') return data = np.asarray(data) to_overlay = self._n_overlay if to_overlay is None else to_overlay data_lim = (data.min(), data.max()) if len(self._data_lim) < to_overlay + 1: self._data_lim.append(data_lim) else: self._data_lim[to_overlay] = data_lim # ------------------------------------------------------------- # TEXTURE COORDINATES # ------------------------------------------------------------- need_reshape = to_overlay >= self._xrange.shape[1] if need_reshape: # Add column of zeros : z_ = np.zeros((len(self), ), dtype=np.float32) z_text = np.zeros((1, LUT_LEN, 4), dtype=np.float32) self._xrange = np.c_[self._xrange, z_] self._alphas = np.c_[self._alphas, z_] self._text2d_data = np.concatenate((self._text2d_data, z_text)) # (x, y) coordinates of the overlay for the texture : self._xrange[vertices, to_overlay] = normalize(data) # Transparency : self._alphas[vertices, to_overlay] = 1. # transparency level # ------------------------------------------------------------- # TEXTURE COLOR # ------------------------------------------------------------- # Colormap interpolation (if needed): colormap = Colormap(**kwargs) vec = np.linspace(data_lim[0], data_lim[1], LUT_LEN) self._text2d_data[to_overlay, ...] = colormap.to_rgba(vec) # ------------------------------------------------------------- # BUFFERS # ------------------------------------------------------------- if need_reshape: # Re-define buffers : self._xrange_buffer = gloo.VertexBuffer(self._xrange) self._text2d = gloo.Texture2D(self._text2d_data) self._alphas_buffer = gloo.VertexBuffer(self._alphas) # Send buffers to vertex shader : self.shared_program.vert['u_range'] = self._xrange_buffer self.shared_program.vert['u_alphas'] = self._alphas_buffer self.shared_program.vert['u_over_text'] = self._text2d else: self._xrange_buffer.set_data(self._xrange) self._text2d.set_data(self._text2d_data) self._alphas_buffer.set_data(self._alphas) # Update the number of overlays : self._n_overlay = to_overlay + 1 self.shared_program.vert['u_n_overlays'] = self._n_overlay
sc = SceneObj(size=(1800, 500), bgcolor=(.1, .1, .1)) for psd_file, channel_coo_file in zip(psd_files, channel_coo_files): path_xyz, basename, ext = split_filename(psd_file) arch = np.load(psd_file) psds, freqs = arch['psds'], arch['freqs'] xyz = np.genfromtxt(channel_coo_file, dtype=float) freq_bands = np.asarray(freq_bands) clim = (psds.min(), psds.max()) # Find indices of frequencies : idx_fplt = np.abs( (freqs.reshape(1, 1, -1) - freq_bands[..., np.newaxis])).argmin(2) psdf = np.array([psds[:, k[0]:k[1]].mean(1) for k in idx_fplt]) radius = normalize(np.c_[psdf.min(1), psdf.max(1)], 5, 25).astype(float) for num, (fb, fbn, psd, rx) in enumerate(zip(freq_bands, freq_band_names, psdf, radius)): s_obj = SourceObj('s', xyz, data=psd, radius_min=rx[0], radius_max=rx[1]) # noqa s_obj.color_sources(data=psd, cmap='cool', clim=clim) sc.add_to_subplot(s_obj, col=num, title=str(fb) + ' - ' + fbn, title_color='white', rotate='top', zoom=.6)
def add_overlay(self, data, vertices=None, to_overlay=None, mask_data=None, **kwargs): """Add an overlay to the mesh. Note that the current implementation limit to a number of of four overlays. Parameters ---------- data : array_like Array of data of shape (n_data,). vertices : array_like | None The vertices to color with the data of shape (n_data,). to_overlay : int | None Add data to a specific overlay. This parameter must be a integer. mask_data : array_like | None Array to specify if some vertices have to be considered as masked (and use the `mask_color` color) kwargs : dict | {} Additional color color properties (cmap, clim, vmin, vmax, under, over, translucent) """ # Check input variables : if vertices is None: vertices = np.ones((len(self),), dtype=bool) # Send data to the mask : if isinstance(mask_data, np.ndarray) and len(mask_data) == len(self): self._bgd_data[mask_data] = .5 self._bgd_buffer.set_data(self._bgd_data) if not len(vertices): logger.warning('Vertices array is empty. Abandoning.') return data = np.asarray(data) to_overlay = self._n_overlay if to_overlay is None else to_overlay data_lim = (data.min(), data.max()) if len(self._data_lim) < to_overlay + 1: self._data_lim.append(data_lim) else: self._data_lim[to_overlay] = data_lim # ------------------------------------------------------------- # TEXTURE COORDINATES # ------------------------------------------------------------- need_reshape = to_overlay >= self._xrange.shape[1] if need_reshape: # Add column of zeros : z_ = np.zeros((len(self),), dtype=np.float32) z_text = np.zeros((1, LUT_LEN, 4), dtype=np.float32) self._xrange = np.c_[self._xrange, z_] self._alphas = np.c_[self._alphas, z_] self._text2d_data = np.concatenate((self._text2d_data, z_text)) # (x, y) coordinates of the overlay for the texture : self._xrange[vertices, to_overlay] = normalize(data) # Transparency : self._alphas[vertices, to_overlay] = 1. # transparency level # ------------------------------------------------------------- # TEXTURE COLOR # ------------------------------------------------------------- # Colormap interpolation (if needed): colormap = Colormap(**kwargs) vec = np.linspace(data_lim[0], data_lim[1], LUT_LEN) self._text2d_data[to_overlay, ...] = colormap.to_rgba(vec) # ------------------------------------------------------------- # BUFFERS # ------------------------------------------------------------- if need_reshape: # Re-define buffers : self._xrange_buffer = gloo.VertexBuffer(self._xrange) self._text2d = gloo.Texture2D(self._text2d_data) self._alphas_buffer = gloo.VertexBuffer(self._alphas) # Send buffers to vertex shader : self.shared_program.vert['u_range'] = self._xrange_buffer self.shared_program.vert['u_alphas'] = self._alphas_buffer self.shared_program.vert['u_over_text'] = self._text2d else: self._xrange_buffer.set_data(self._xrange) self._text2d.set_data(self._text2d_data) self._alphas_buffer.set_data(self._alphas) # Update the number of overlays : self._n_overlay = to_overlay + 1 self.shared_program.vert['u_n_overlays'] = self._n_overlay