Você pode passar plt.scatterum cargumento que lhe permitirá selecionar as cores. O código a seguir define um colorsdicionário para mapear as cores do diamante para as cores de plotagem.
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]) mapeia efetivamente as cores de "diamante" para "plotagem".
(Perdoe-me por não colocar outra imagem de exemplo, acho que 2 é o suficiente: P)
Com seaborn
Você pode usar o seabornque é um invólucro matplotlibque o torna mais bonito por padrão (em vez de baseado em opinião, eu sei: P), mas também adiciona algumas funções de plotagem.
Para isso, você pode usar seaborn.lmplotcom fit_reg=False(o que o impede de fazer alguma regressão automaticamente).
O código a seguir usa um conjunto de dados de exemplo. Ao selecionar, hue='color'você diz ao seaborn para dividir seu dataframe com base em suas cores e, em seguida, plotar cada uma.
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()

Sem seabornusarpandas.groupby
Se você não quiser usar seaborn, você pode usar pandas.groupbypara obter as cores sozinhas e, em seguida, plotá-las usando apenas matplotlib, mas você terá que atribuir cores manualmente à medida que avança. Eu adicionei um exemplo abaixo:
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 assume o mesmo DataFrame acima e, a seguir, o agrupa com base em color. Em seguida, itera sobre esses grupos, traçando para cada um. Para selecionar uma cor, criei um colorsdicionário que pode mapear a cor do diamante (por exemplo D) para uma cor real (por exemplo red).
