Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pandas - scatter plot with different color legend for each point

Starting from the following example:

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)

what I obtained is the following scatterplot:

enter image description here

I'm now trying to set a different color for each of the four points. I know that I can loop over a set of, for instance, 4 colors in a list like:

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

but since my real dataset comprise at least 20 different points, I was looking for a sort of "color generator" to loop within it.

like image 512
Fabio Lamanna Avatar asked Jun 14 '16 12:06

Fabio Lamanna


2 Answers

The following method will create a list of colors as long as your dataframe, and then plot a point with a label with each 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()

enter image description here

like image 78
tmdavison Avatar answered Oct 13 '22 20:10

tmdavison


IIUC you can do it this way:

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)] - should always remain in the list bounds

like image 35
MaxU - stop WAR against UA Avatar answered Oct 13 '22 19:10

MaxU - stop WAR against UA