File size: 2,227 Bytes
90b47cf ef53368 90b47cf ef53368 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | """Correlation-heatmap panels for the composite-formula ablation workbook.
Two seaborn heatmaps behind the ablation workbook's feature-correlation panels: a per-nucleus lower-triangle
correlation matrix among the five composite-model features (stationary shielding, PCM, Desmond, its
vibrational analogue, QCD), and a PCM-vs-Desmond Pearson r table by nucleus and solvent. The notebook
supplies the correlation table(s) computed by delta22.py and calls these functions directly.
"""
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
def plot_feature_correlation_heatmap(corr_matrix, vmin, vmax, cmap, title="", figsize=(6, 5), save_path=None):
"""Lower-triangle seaborn heatmap of a correlation matrix (Pearson r)."""
# In a strict lower triangle the first row and last column hold no cells, so drop them to avoid
# a blank leading/trailing strip; the diagonal of the trimmed matrix is a real below-diagonal value.
trimmed = corr_matrix.iloc[1:, :-1]
mask = np.triu(np.ones(trimmed.shape, dtype=bool), k=1) # keep the diagonal of the trimmed matrix
fig, ax = plt.subplots(figsize=figsize)
sns.heatmap(trimmed, mask=mask, annot=True, fmt=".3f", cmap=cmap, vmin=vmin, vmax=vmax,
square=True, cbar=False, ax=ax)
ax.set_title(title, fontsize=11)
fig.tight_layout()
if save_path:
fig.savefig(save_path, dpi=300, bbox_inches="tight")
return fig
def plot_pcm_desmond_correlation_table(corr_table, figsize=(13, 4.5), save_path=None):
"""Annotated seaborn heatmap of PCM-vs-Desmond Pearson r: rows = nucleus, columns = solvent."""
# tall figsize keeps the two rows from being squashed by the rotated solvent labels
fig, ax = plt.subplots(figsize=figsize)
sns.heatmap(corr_table, annot=True, fmt=".3f", cmap="RdBu", vmin=-1, vmax=1, square=True,
linewidths=0.5, cbar=False, ax=ax)
ax.set_title("PCM vs. Desmond Pearson $r$ by Solvent")
_sup = {"H": "$^{1}$H", "C": "$^{13}$C"}
ax.set_yticklabels([_sup.get(t.get_text(), t.get_text()) for t in ax.get_yticklabels()], rotation=0)
fig.tight_layout()
if save_path:
fig.savefig(save_path, dpi=300, bbox_inches="tight")
return fig
|