Я думаю, что вы используете старую версию matplotlib, поскольку я получаю следующее предупреждение (matplotlib 3.1.3):
'c' аргумент выглядит как одна цифра c Последовательность RGB или RGBA, которую следует избегать, так как отображение значений будет иметь приоритет в случае совпадения его длины с «x» и «y». Пожалуйста, используйте двумерный массив с одной строкой, если вы действительно хотите указать одно и то же значение RGB или RGBA для всех точек.
Это именно то, что происходит в вашем случае. Решение простое:
ax.scatter(x_values, y_values, s = size*10, c = [color])
Кроме того, вы должны изменить случайные цвета, чтобы они были в пределах 0 и 1:
colors = {i:np.random.random(3,) for i in ...}
Подробно, поскольку третья категория имеет такое же количество items (three) в качестве цвета, matplotlib будет использовать карту цветов (по умолчанию viridis), чтобы отобразить значение в цвет. Действительно, если вы проверите цветовую карту viridis , вы увидите, что она, кажется, содержит эти три цвета.