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?
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.
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:
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:
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. ]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With