2016-06-14 9 views
4

Начиная со следующим примером:панд - Разброс участок с разным цветом легендой для каждой точки

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) 

, что я получил это следующее рассеивание:

enter image description here

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

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

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

ответ

2

Следующий метод создаст список цветов, до тех пор, как ваш dataframe, а затем запишите точку с меткой с каждым цветом:

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() 

enter image description here

2

Как об этом,

enter image description here


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

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() 
+0

Спасибо, я знал об этой технике, но поскольку мои очки могут различаться по длине, я искал нечто более общее, не связанное с фиксированным количеством очков. –

+0

@FabioLamanna, используйте 'colors = cm.rainbow (np.linspace (0, 1, len (d ['f'])))', чтобы создать кучу цветов. Я только что обновил свой ответ. – SparkAndShine

2

IIUC вы можете сделать это следующим образом:

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'] 

enter image description here

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

Смежные вопросы