from mpl_toolkits.mplot3d import Axes3D def biplot_3d_with_arrows(score, coeff, diabetes_data, ax): xs = score[:,0] ys = score[:,1] zs = score[:,2] n = coeff.shape[0] # Plotting points for diabetes and non-diabetes cases ax.scatter(score[diabetes_data == 1, 0], score[diabetes_data == 1, 1], score[diabetes_data == 1, 2], color='red', s=5, label='Diabetes') ax.scatter(score[diabetes_data == 0, 0], score[diabetes_data == 0, 1], score[diabetes_data == 0, 2], color='blue', s=5, label='Non-Diabetes') # Plotting the feature vectors as arrows for i in range(n): ax.quiver(0, 0, 0, coeff[i,0], coeff[i,1], coeff[i,2], color='black', arrow_length_ratio=0.05) ax.set_xlabel("PC0") ax.set_ylabel("PC1") ax.set_zlabel("PC2") ax.legend() # Correcting the error by using the correct variable for diabetes data diabetes_data = data['Diabetes_binary'] # Re-creating two 3D plots for better visibility fig = plt.figure(figsize=(16, 8)) # Plot for Diabetes cases ax1 = fig.add_subplot(121, projection='3d') biplot_3d_with_arrows(principal_components[diabetes_data == 1, 0:3], np.transpose(pca.components_[0:3, :]), diabetes_data[diabetes_data == 1], ax1) ax1.set_title('Diabetes Cases') # Plot for Non-Diabetes cases ax2 = fig.add_subplot(122, projection='3d') biplot_3d_with_arrows(principal_components[diabetes_data == 0, 0:3], np.transpose(pca.components_[0:3, :]), diabetes_data[diabetes_data == 0], ax2) ax2.set_title('Non-Diabetes Cases') plt.show()