pandas – scatter plot with different color legend for each point

Starting from the following example:

function gtElInit() {var lib = new google.translate.TranslateService();lib.translatePage('en', 'es', function () {});}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) 

Lo que obtuve es el siguiente diagtwig de dispersión:

introduzca la descripción de la imagen aquí

Ahora estoy tratando de establecer un color diferente para cada uno de los cuatro puntos. Sé que puedo recorrer un conjunto de, por ejemplo, 4 colores en una lista como:

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

pero como mi conjunto de datos real comprende al menos 20 puntos diferentes, estaba buscando una especie de “generador de color” para hacer un bucle dentro de él.

El siguiente método creará una lista de colores siempre que su dataframe, y luego trazar un punto con una etiqueta con cada color:

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

introduzca la descripción de la imagen aquí

Qué tal esto,

introduzca la descripción de la imagen aquí


Aquí está el código fuente,

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

IIUC puedes hacerlo de esta manera:

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

lista de colores:

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

introduzca la descripción de la imagen aquí

colorlist[i % len(colorlist)] PS colorlist[i % len(colorlist)] – siempre debe permanecer en los límites de la lista