Atualmente estou criando um gráfico de dispersão com os resultados de algumas avaliações que estou fazendo.
Para obter um dataframe com a mesma estrutura que o meu, você pode executar:
import pandas as pd
models = ["60000_25_6", "60000_26_6"]
results = []
for i in range(10):
for model in models:
results.append({"simulation": i, "model_id": model, "count_at_1": 1, "count_at_5": 5, "count_at_10": 10})
df = pd.DataFrame(results)
Você acabará com um dataframe do pandas parecido com este, apenas com valores padrão (este é um dataframe menor, observe que o tamanho é variável e muito maior dependendo das configurações que eu uso):
simulation model_id count_at_1 count_at_5 count_at_10
0 0 60000_25_6 60 77 84
1 0 60000_26_6 60 76 83
2 1 60000_25_6 69 80 82
...
18 9 60000_25_6 1 70 79
19 9 60000_26_6 1 68 74
Em seguida, uso o seguinte código para adicionar cores a cada ponto:
import matplotlib.pyplot as plt
colors = plt.get_cmap('hsv')
colors = [colors(i) for i in np.linspace(0,0.95, len(models))]
cmap = {model: colors[i] for i, model in enumerate(models)}
df['color'] = df.apply(lambda row: cmap[row['model_id']], axis=1)
E df agora é:
simulation model_id count_at_1 count_at_5 count_at_10 color
0 0 60000_25_6 74 81 83 (1.0, 0.0, 0.0, 1.0)
1 0 60000_26_6 75 80 83 (1.0, 0.0, 0.5, 1.0)
2 1 60000_25_6 71 84 89 (1.0, 0.0, 0.0, 1.0)
...
18 9 60000_25_6 2 69 79 (1.0, 0.0, 0.0, 1.0)
19 9 60000_26_6 2 72 78 (1.0, 0.0, 0.5, 1.0)
No entanto, quando corro:
df.plot.scatter('count_at_1', 'count_at_5', c='color', legend=True)
plt.show()
Nenhuma lenda aparece, apenas recebo um enredo normal assim:
Como posso adicionar uma legenda onde se pareça com:
[model_id] [color]
...
Mas no formato matplotlib normal, vou levá-lo para qualquer lugar do gráfico.