# HG changeset patch # User luca_milaz # Date 1722860638 0 # Node ID 376afe557f908cbae78d297c90d3a3133da13369 # Parent ecfd728882219cf6bdd51c91724350c1b1b290d8 Uploaded diff -r ecfd72888221 -r 376afe557f90 marea_2/flux_to_map.py --- a/marea_2/flux_to_map.py Mon Aug 05 12:17:15 2024 +0000 +++ b/marea_2/flux_to_map.py Mon Aug 05 12:23:58 2024 +0000 @@ -831,31 +831,6 @@ dataset = dataset.drop(dataset.columns[0], axis = "columns").to_dict("list") return { id : list(map(utils.Float("Dataset values, not an argument"), values)) for id, values in dataset.items() }, IDs -def jet_colormap(value): - """ - Generate an RGB color based on a single numeric value using a colormap similar to MATLAB's 'jet'. - - Args: - value (float): A numeric value to be mapped to a color. - - Returns: - numpy.ndarray: An array of RGB color components (in the range [0, 1]). - """ - value = abs(value) - - if(np.round(value, 6) == 0.0): - return np.array([0.745, 0.745, 0.745]) #grey - - # Define the red, green, and blue color components - red = np.clip(1.5 - np.abs(4 * (value - 0.75)), 0, 1) - green = np.clip(1.5 - np.abs(4 * (value - 0.5)), 0, 1) - blue = np.clip(1.5 - np.abs(4 * (value - 0.25)), 0, 1) - - # Combine the color components into an RGB array - rgb = np.array([red, green, blue]) - - return rgb - def rgb_to_hex(rgb): """ Convert RGB values (0-1 range) to hexadecimal color format. @@ -870,9 +845,7 @@ rgb = (rgb * 255).astype(int) return '#{:02x}{:02x}{:02x}'.format(rgb[0], rgb[1], rgb[2]) - - -def save_colormap_image(min_value:float, max_value:float, path:str): +def save_colormap_image(min_value: float, max_value: float, path: str): """ Create and save an image of the colormap showing the gradient and its range. @@ -881,28 +854,27 @@ max_value (float): The maximum value of the colormap range. filename (str): The filename for saving the image. """ - # Define image size and create a new image - width = 256 - height = 50 - image = Image.new('RGB', (width, height), color='white') - draw = ImageDraw.Draw(image) - - # Create the gradient - for x in range(width): - value = (x / (width - 1)) * (max_value - min_value) + min_value - color_arr = jet_colormap((value - min_value) / (max_value - min_value)) - color = tuple(int(c * 255) for c in color_arr) - draw.line([(x, 0), (x, height)], fill=color) - - # Add text for min and max values - font = ImageFont.load_default() - draw.text((10, height - 20), f'{min_value:.2f}', fill='white', font=font) - draw.text((width - 50, height - 20), f'{max_value:.2f}', fill='white', font=font) - + # Generate a range of values + values = np.linspace(min_value, max_value, 256) + + # Create a colormap using seaborn + cmap = sns.color_palette("jet", as_cmap=True) + + # Create a figure and axis + fig, ax = plt.subplots(figsize=(6, 1)) + fig.subplots_adjust(bottom=0.5) + + # Create a gradient image + gradient = np.linspace(0, 1, 256) + gradient = np.vstack((gradient, gradient)) + + # Display the gradient image + ax.imshow(gradient, aspect='auto', cmap=cmap) + ax.set_axis_off() + # Save the image - image.save(path.show()) - pass - + plt.savefig(path, bbox_inches='tight', pad_inches=0) + plt.close() def computeEnrichmentMeanMedian(metabMap: ET.ElementTree, class_pat: Dict[str, List[List[float]]], ids: List[str]) -> None: """ @@ -935,20 +907,16 @@ medians = {key: median / max_flux_medians for key, median in medians.items()} means = {key: mean / max_flux_means for key, mean in means.items()} - save_colormap_image(min_flux_medians, max_flux_medians, utils.FilePath("Color map median", ext=utils.FileFormat.PNG, prefix="result")) - save_colormap_image(min_flux_means, max_flux_means, utils.FilePath("Color map mean", ext=utils.FileFormat.PNG, prefix="result")) + save_colormap_image(min_flux_medians, max_flux_medians, "colormap_median.png") + save_colormap_image(min_flux_means, max_flux_means, "colormap_mean.png") for key in class_pat: # Create color mappings for median and mean - colors_median = {rxn_id: rgb_to_hex(jet_colormap(medians[key][i])) for i, rxn_id in enumerate(ids)} - colors_mean = {rxn_id: rgb_to_hex(jet_colormap(means[key][i])) for i, rxn_id in enumerate(ids)} + colors_median = {rxn_id: rgb_to_hex(sns.color_palette("jet", as_cmap=True)((medians[key][i] + 1) / 2)) for i, rxn_id in enumerate(ids)} + colors_mean = {rxn_id: rgb_to_hex(sns.color_palette("jet", as_cmap=True)((means[key][i] + 1) / 2)) for i, rxn_id in enumerate(ids)} for i, rxn_id in enumerate(ids): - - isNegative = False - - if(medians[key][i] <0): - isNegative = True + isNegative = medians[key][i] < 0 # Apply median arrows apply_arrow(metabMap_median, rxn_id, colors_median[rxn_id], isNegative) @@ -960,9 +928,6 @@ save_and_convert(metabMap_mean, "mean", key) save_and_convert(metabMap_median, "median", key) - - - def apply_arrow(metabMap, rxn_id, color, isNegative): """ Apply an arrow to a specific reaction in the metabolic map with a given color.