Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

matplotlib scatter plot colour as function of third variable [duplicate]

I would like to know how to make matplotlib's scatter function colour points by a third variable.

Questions gnuplot linecolor variable in matplotlib? and Matplotlib scatterplot; colour as a function of a third variable posed similar queries, however, the answers to those questions don't address my issue: the use of c=arraywhichspecifiespointcolour in the scatter function only sets the fill colour, not the edge colour. This means that the use of c=arr... fails when using markersymbol='+', for instance (because that marker has no fill, only edges). I want points to be coloured by a third variable reliably, regardless of which symbol is used.

Is there a way to achieve this with Matplotlib's scatter function?

like image 690
aaron_python_dude Avatar asked Oct 18 '12 23:10

aaron_python_dude


People also ask

Is it possible to create a colored scatter plot using matplotlib?

Scatter Plot Color by Category using MatplotlibMatplotlib scatter has a parameter c which allows an array-like or a list of colors. The code below defines a colors dictionary to map your Continent colors to the plotting colors.


1 Answers

This works for me, using matplotlib 1.1:

import numpy as np import matplotlib.pyplot as plt  x = np.arange(10) y = np.sin(x)  plt.scatter(x, y, marker='+', s=150, linewidths=4, c=y, cmap=plt.cm.coolwarm) plt.show() 

Result:

enter image description here

Alternatively, for n points, make an array of RGB color values with shape (n, 3), and assign it to the edgecolors keyword argument of scatter():

import numpy as np import matplotlib.pyplot as plt  x = np.linspace(0, 20, 100) y = np.sin(x) z = x + 20 * y  scaled_z = (z - z.min()) / z.ptp() colors = plt.cm.coolwarm(scaled_z)  plt.scatter(x, y, marker='+', edgecolors=colors, s=150, linewidths=4) plt.show() 

Result: enter image description here

That example gets the RGBA values by scaling the z values to the range [0,1], and calling the colormap plt.cm.coolwarm with the scaled values. When called this way, a matplotlib colormap returns an array of RGBA values, with each row giving the color of the corresponding input value. For example:

>>> t = np.linspace(0, 1, 5) >>> t array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ]) >>> plt.cm.coolwarm(t)  array([[ 0.2298,  0.2987,  0.7537,  1.    ],        [ 0.5543,  0.6901,  0.9955,  1.    ],        [ 0.8674,  0.8644,  0.8626,  1.    ],        [ 0.9567,  0.598 ,  0.4773,  1.    ],        [ 0.7057,  0.0156,  0.1502,  1.    ]]) 
like image 110
Warren Weckesser Avatar answered Sep 30 '22 19:09

Warren Weckesser