# Setting different color for each series in scatter plot on matplotlib

### Question

Suppose I have three data sets:

``````X = [1,2,3,4]
Y1 = [4,8,12,16]
Y2 = [1,4,9,16]
``````

I can scatter plot this:

``````from matplotlib import pyplot as plt
plt.scatter(X,Y1,color='red')
plt.scatter(X,Y2,color='blue')
plt.show()
``````

How can I do this with 10 sets?

I searched for this and could find any reference to what I'm asking.

Edit: clarifying (hopefully) my question

If I call scatter multiple times, I can only set the same color on each scatter. Also, I know I can set a color array manually but I'm sure there is a better way to do this. My question is then, "How can I automatically scatter-plot my several data sets, each with a different color.

If that helps, I can easily assign a unique number to each data set.

1
142
12/29/2016 7:48:19 PM

I don't know what you mean by 'manually'. You can choose a colourmap and make a colour array easily enough:

``````import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

x = np.arange(10)
ys = [i+x+(i*x)**2 for i in range(10)]

colors = cm.rainbow(np.linspace(0, 1, len(ys)))
for y, c in zip(ys, colors):
plt.scatter(x, y, color=c)
`````` Or you can make your own colour cycler using `itertools.cycle` and specifying the colours you want to loop over, using `next` to get the one you want. For example, with 3 colours:

``````import itertools

colors = itertools.cycle(["r", "b", "g"])
for y in ys:
plt.scatter(x, y, color=next(colors))
`````` Come to think of it, maybe it's cleaner not to use `zip` with the first one too:

``````colors = iter(cm.rainbow(np.linspace(0, 1, len(ys))))
for y in ys:
plt.scatter(x, y, color=next(colors))
``````
227
11/13/2018 1:20:58 PM

The normal way to plot plots with points in different colors in matplotlib is to pass a list of colors as a parameter.

E.g.:

``````import matplotlib.pyplot
matplotlib.pyplot.scatter([1,2,3],[4,5,6],color=['red','green','blue'])
`````` When you have a list of lists and you want them colored per list. I think the most elegant way is that suggesyted by @DSM, just do a loop making multiple calls to scatter.

But if for some reason you wanted to do it with just one call, you can make a big list of colors, with a list comprehension and a bit of flooring division:

``````import matplotlib
import numpy as np

X = [1,2,3,4]
Ys = np.array([[4,8,12,16],
[1,4,9,16],
[17, 10, 13, 18],
[9, 10, 18, 11],
[4, 15, 17, 6],
[7, 10, 8, 7],
[9, 0, 10, 11],
[14, 1, 15, 5],
[8, 15, 9, 14],
[20, 7, 1, 5]])
nCols = len(X)
nRows = Ys.shape

colors = matplotlib.cm.rainbow(np.linspace(0, 1, len(Ys)))

cs = [colors[i//len(X)] for i in range(len(Ys)*len(X))] #could be done with numpy's repmat
Xs=X*nRows #use list multiplication for repetition
matplotlib.pyplot.scatter(Xs,Ys.flatten(),color=cs)
`````` ``````cs = [array([ 0.5,  0. ,  1. ,  1. ]),
array([ 0.5,  0. ,  1. ,  1. ]),
array([ 0.5,  0. ,  1. ,  1. ]),
array([ 0.5,  0. ,  1. ,  1. ]),
array([ 0.28039216,  0.33815827,  0.98516223,  1.        ]),
array([ 0.28039216,  0.33815827,  0.98516223,  1.        ]),
array([ 0.28039216,  0.33815827,  0.98516223,  1.        ]),
array([ 0.28039216,  0.33815827,  0.98516223,  1.        ]),
...
array([  1.00000000e+00,   1.22464680e-16,   6.12323400e-17,
1.00000000e+00]),
array([  1.00000000e+00,   1.22464680e-16,   6.12323400e-17,
1.00000000e+00]),
array([  1.00000000e+00,   1.22464680e-16,   6.12323400e-17,
1.00000000e+00]),
array([  1.00000000e+00,   1.22464680e-16,   6.12323400e-17,
1.00000000e+00])]
``````