Puede pasar plt.scatterun cargumento que le permitirá seleccionar los colores. El siguiente código define un colorsdiccionario para asignar los colores de su diamante a los colores de trazado.
import matplotlib.pyplot as plt
import pandas as pd
carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30]
price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600]
color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',]
df = pd.DataFrame(dict(carat=carat, price=price, color=color))
fig, ax = plt.subplots()
colors = {'D':'red', 'E':'blue', 'F':'green', 'G':'black'}
ax.scatter(df['carat'], df['price'], c=df['color'].apply(lambda x: colors[x]))
plt.show()
df['color'].apply(lambda x: colors[x]) mapea eficazmente los colores de "diamante" a "trazado".
(Perdóname por no poner otra imagen de ejemplo, creo que 2 es suficiente: P)
Con seaborn
Puede usar seaborncuál es un envoltorio matplotlibque lo hace lucir más bonito por defecto (más bien basado en opiniones, lo sé: P) pero también agrega algunas funciones de trazado.
Para esto, puede usar seaborn.lmplotcon fit_reg=False(lo que evita que automáticamente haga alguna regresión).
El siguiente código utiliza un conjunto de datos de ejemplo. Al seleccionar, hue='color'le dice a seaborn que divida su marco de datos en función de sus colores y luego trace cada uno.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30]
price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600]
color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',]
df = pd.DataFrame(dict(carat=carat, price=price, color=color))
sns.lmplot('carat', 'price', data=df, hue='color', fit_reg=False)
plt.show()

Sin seabornusarpandas.groupby
Si no desea usar seaborn, puede usar pandas.groupbypara obtener los colores solo y luego trazarlos usando solo matplotlib, pero tendrá que asignar colores manualmente a medida que avanza, agregué un ejemplo a continuación:
fig, ax = plt.subplots()
colors = {'D':'red', 'E':'blue', 'F':'green', 'G':'black'}
grouped = df.groupby('color')
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='carat', y='price', label=key, color=colors[key])
plt.show()
Este código asume el mismo DataFrame que el anterior y luego lo agrupa en función de color. Luego itera sobre estos grupos, trazando para cada uno. Para seleccionar un color, he creado un colorsdiccionario que puede asignar el color del diamante (por ejemplo D) a un color real (por ejemplo red).
