pandas - точечный график с разными цветовыми обозначениями для каждой точки

Начиная со следующего примера:

fig, ax = plt.subplots()

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['a','b','c','d']})

for label in df['l']:

    df.plot('n1','n2', kind='scatter', ax=ax, s=50, linewidth=0.1, label=label)

я получил следующий график рассеяния:

Я сейчас пытаюсь установить разные цвета для каждой из четырех точек. Я знаю, что могу зациклить набор, например, 4 цвета в списке, как:

colorlist = ['b','r','c','y']

но так как мой реальный набор данных содержит не менее 20 различных точек, я искал своего рода «генератор цветов», чтобы зацикливаться в нем.

Ответы на вопрос(3)

Вот исходный код,

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib import cm

fig, ax = plt.subplots()

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['a','b','c','d']})

#colors = ['b','r','c','y']
nrof_labels = len(df['l'])
colors = cm.rainbow(np.linspace(0, 1, nrof_labels))     # create a bunch of colors

for i, r in df.iterrows():
    ax.plot(r['n1'], r['n2'], 'o', markersize=10, color=colors[i], linewidth=0.1, label=r['l'])

ax.set_xlim(0.5, 3.5)
ax.set_ylim(0.5, 3.5)
plt.legend(loc='best')

plt.show()
 SparkAndShine14 июн. 2016 г., 15:27
@FabioLamanna, используйтеcolors = cm.rainbow(np.linspace(0, 1, len(d['f']))) создать кучу цветов. Я только что обновил свой ответ.
 Fabio Lamanna14 июн. 2016 г., 15:10
Спасибо, я знал об этой технике, но так как мои очки могут различаться по длине, я искал что-то более общее, не связанное с фиксированным количеством очков.
Решение Вопроса

а затем построит точку с меткой для каждого цвета:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as colors
import numpy as np
import pandas as pd

fig, ax = plt.subplots()

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['a','b','c','d']})

colormap = cm.viridis
colorlist = [colors.rgb2hex(colormap(i)) for i in np.linspace(0, 0.9, len(df['l']))]

for i,c in enumerate(colorlist):

    x = df['n1'][i]
    y = df['n2'][i]
    l = df['l'][i]

    ax.scatter(x, y, label=l, s=50, linewidth=0.1, c=c)

ax.legend()

plt.show()

import matplotlib.pyplot as plt
from matplotlib import colors
import pandas as pd

colorlist = list(colors.ColorConverter.colors.keys())
fig, ax = plt.subplots()
[df.iloc[[i]].plot.scatter('n1', 'n2', ax=ax, s=50, label=l,
                         color=colorlist[i % len(colorlist)])
 for i,l in enumerate(df.l)]

colorlist:

In [223]: colorlist
Out[223]: ['m', 'b', 'g', 'r', 'k', 'y', 'c', 'w']

PScolorlist[i % len(colorlist)] - всегда должен оставаться в списке границ

Ваш ответ на вопрос