import pandas as pd import os import matplotlib.pyplot as plt from PIL import Image # 1. CONFIGURATION (Relative paths for portability) BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # Strictly use the root results file generated by graficar_tsne_msi.py CSV_PATH = os.path.join(BASE_DIR, "..", "msi_clusters_results.csv") IMG_DIR = os.path.join(BASE_DIR, "..", "datos_para_ai") OUTPUT_DIR = os.path.join(BASE_DIR, "..", "figures", "galleries") os.makedirs(OUTPUT_DIR, exist_ok=True) # 2. PROCESSING if os.path.exists(CSV_PATH): print(f"Loading results from: {CSV_PATH}") df = pd.read_csv(CSV_PATH) # Detect the correct column for ion image names possible_cols = ['ion_image', 'ion', 'filename'] img_col = next((c for c in possible_cols if c in df.columns), None) if not img_col: print(f"Error: Could not find image column in {CSV_PATH}. Available: {df.columns.tolist()}") else: for cluster_id in sorted(df['cluster'].unique()): print(f"Generating gallery for Cluster {cluster_id}...") # Take a 3x3 sample of the cluster cluster_ions = df[df['cluster'] == cluster_id][img_col].head(9).tolist() fig, axes = plt.subplots(3, 3, figsize=(10, 10)) fig.suptitle(f"Cluster {cluster_id} - Ion Morphologies", fontsize=16) for i, ax in enumerate(axes.flat): if i < len(cluster_ions): img_path = os.path.join(IMG_DIR, cluster_ions[i]) if os.path.exists(img_path): img = Image.open(img_path) # Using 'viridis' improves human visibility of low-concentration transport traces in the veins ax.imshow(img, cmap='viridis') ax.set_title(cluster_ions[i], fontsize=8) else: ax.text(0.5, 0.5, 'Image Not Found', ha='center', va='center', fontsize=6) ax.axis('off') plt.tight_layout() # Standardized filename for consistency plt.savefig(f"{OUTPUT_DIR}/Gallery_cluster_{cluster_id}.png") plt.close() print(f"\nGalleries successfully saved in: {OUTPUT_DIR}") else: print(f"Error: Missing required results file: {CSV_PATH}") print("Please run 'python scripts_python/graficar_tsne_msi.py' first to generate results.")