Reducing 300 dimensions to only 2D is extremely aggressive and will inevitably lead to significant information loss.
reducer = umap.UMAP(n_components=20, random_state=42)
Higher n_components captures more information but may lose the interpretability of low-dimensional embeddings.