loadings = pd.DataFrame( data=pca.components_.T * np.sqrt(pca.explained_variance_), columns=[f"PC{i}" for i in range(1, len(X.columns) + 1)], index=X.columns ) fig, axs = plt.subplots(2, 2, figsize=(14, 10), sharex=True, sharey=True) colors = ["#1C3041", "#9B1D20", "#0B6E4F", "#895884"] for i, ax in enumerate(axs.flatten()): explained_variance = pca.explained_variance_ratio_[i] * 100 pc = f"PC{i+1}" bars = ax.bar(loadings.index, loadings[pc], color=colors[i], edgecolor="#000000", linewidth=1.2) ax.set_title(f"{pc} Loading Scores ({explained_variance:.2f}% Explained Variance)", loc="left", fontdict={"weight": "bold"}, y=1.06) ax.set_xlabel("Feature") ax.set_ylabel("Loading Score") ax.grid(axis="y") ax.tick_params(axis="x", rotation=90) ax.set_ylim(-1, 1) for bar in bars: yval = bar.get_height() offset = yval + 0.02 if yval > 0 else yval - 0.15 ax.text(bar.get_x() + bar.get_width() / 2, offset, f"{yval:.2f}", ha="center", va="bottom") plt.tight_layout() plt.show()