from sklearn.metrics import v_measure_score import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from tqdm import tqdm def plot_clustering_similarity_matrix(df, clustering_cols): # 1. Inicjalizacja pustej macierzy n = len(clustering_cols) v_matrix = np.zeros((n, n)) # 2. Obliczanie V-measure dla każdej pary (używa pełnych nazw kolumn) for i in tqdm(range(n), desc="Obliczanie V-measure"): for j in range(i, n): score = v_measure_score( df[clustering_cols[i]].astype(str), df[clustering_cols[j]].astype(str) ) v_matrix[i, j] = score v_matrix[j, i] = score # 3. Przygotowanie skróconych nazw poprzez usunięcie "cluster." z początku # Jeśli nazwa zaczyna się od 'cluster.', odcinamy to, w innym wypadku zostawiamy oryginalną. short_labels = [col.replace('cluster.', '', 1) if col.startswith('cluster.') else col for col in clustering_cols] # 4. Konwersja do DataFrame dla Seaborn z nowymi, skróconymi etykietami v_df = pd.DataFrame(v_matrix, index=short_labels, columns=short_labels) # 5. Rysowanie wykresu plt.figure(figsize=(22, 22)) # Delikatnie powiększone, aby pomieścić 32 kolumny sns.set_theme(style="white") # Tworzymy maskę, aby ukryć górny trójkąt dla czytelności mask = np.triu(np.ones_like(v_df, dtype=bool), k=1) heatmap = sns.heatmap( v_df, mask=mask, annot=True, # Wyświetla wartości liczbowe fmt=".2f", # Formatowanie do 2 miejsc po przecinku cmap="YlGnBu", # Przyjemna dla oka paleta kolorów linewidths=.5, cbar_kws={"shrink": .7, "label": "V-measure Score"}, annot_kws={"size": 9} # Zmniejszony font podpisów w kwadracikach, żeby się nie zbiły ) plt.title('Podobieństwo klastrowań (V-measure Matrix)', fontsize=18, pad=25, fontweight='bold') # Obrót etykiet dla lepszej czytelności przy 32 kolumnach # plt.xticks(rotation=45, ha='right', fontsize=10) plt.xticks(rotation=90, ha='right', fontsize=10) plt.yticks(rotation=0, fontsize=10) plt.tight_layout() plt.show()