Так что проблема не в вашем коде, а в том, как создаются swarmplots. Swarmplots создают точки и следят за тем, чтобы «точки корректировались (только вдоль категориальной оси), чтобы они не перекрывались». Когда у вас много данных и много точек пересекаются, это затрудняет работу, и большинство значений rating / user_good перекрываются.
Я настоятельно рекомендую использовать скрипичный сюжет. Он даст вам ту же информацию, которую вы пытаетесь отождествить с роем, и будет работать значительно быстрее.
fig, ax = plt.subplots(figsize=(15, 15))
ax = sns.violinplot(x="rating", y="user_good", data=df, cut = 0)
ax.set_xlabel("Rating",size = 20,alpha=0.8)
ax.set_ylabel("Goodness of User who got Rated",size = 20,alpha=0.8)
ax.set_title("Distributin of Rating and How are Goodness Score of ratee",size=20)