Search code examples
pythonmatplotlibscatter-plot

Setting different color for each series in scatter plot


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.


Solution

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

    Matplotlib graph with different colors

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

    Matplotlib graph with only 3 colors

    Come to think of it, maybe it's cleaner not to use zip with the first one neither:

    colors = iter(cm.rainbow(np.linspace(0, 1, len(ys))))
    for y in ys:
        plt.scatter(x, y, color=next(colors))