total_explained_variance = sum(pca.explained_variance_ratio_[:3]) * 100 colors = ["#1C3041", "#9B1D20", "#0B6E4F", "#895884", "#F07605", "#F5E400"] pca_3d_df = pd.DataFrame(pca_res[:, :3], columns=["PC1", "PC2", "PC3"]) pca_3d_df["y"] = data["quality"] fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(projection="3d") for i, target in enumerate(sorted(pca_3d_df["y"].unique())): subset = pca_3d_df[pca_3d_df["y"] == target] ax.scatter(xs=subset["PC1"], ys=subset["PC2"], zs=subset["PC3"], s=70, alpha=0.7, c=colors[i], edgecolors="#000000", label=target) ax.set_xlabel("Principal Component 1") ax.set_ylabel("Principal Component 2") ax.set_zlabel("Principal Component 3") ax.set_title(f"Wine Quality Dataset PCA ({total_explained_variance:.2f}% Explained Variance)", loc="left", fontdict={"weight": "bold"}) ax.legend(title="Wine quality", loc="lower left") plt.show()