> Modules non standards > Matplotlib > Couleurs sous matplotlib
Couleurs sous matplotlib
Couleurs
Les couleurs peuvent être indiquées de différentes façons :
- sous forme d'une lettre : 'b' = blue (bleu), 'g' = green (vert), 'r' = red (rouge), 'c' = cyan (cyan), 'm' = magenta (magenta), 'y' = yellow (jaune), 'k' = black (noir), 'w' = white (blanc).
- sous forme d'un nombre entre 0 et 1 entre quotes qui indique le niveau de gris : par exemple '0.70' ('1' = blanc, '0' = noir).
- sous forme d'un nom : par exemple 'red'.
- sous forme html avec les niveaux respectifs de rouge (R), vert (G) et bleu (B) : '#ffee00'.
- sous forme d'un triplet de valeurs entre 0 et 1 avec les niveaux de R, G et B : (0.2, 0.9, 0.1)
Exemple de graphe avec différentes couleurs exprimées sous différentes formes :
pyplot.figure()
pyplot.scatter(range(5), [x ** 2 for x in range(5)], s = 100,
color = ['blue', 'red', '0.70', 'r', '#ffee00'])
pyplot.title('differentes couleurs sous differentes formes')
pyplot.rcParams['axes.prop_cycle'].by_key()['color'] : la liste des couleurs par défaut.
Pour avoir la liste des noms de couleurs disponibles : matplotlib.colors.cnames renvoie un dictionnaire nom de couleur vers couleur HTML : {'indigo': '#4B0082', 'gold': '#FFD700', ...}.
Couleurs disponibles sous forme textuelle :
import matplotlib
import colorsys
columnNbr = 5
colorNames = list(matplotlib.colors.cnames.keys())
colorNames.sort(key = lambda x: colorsys.rgb_to_hsv(
*matplotlib.colors.colorConverter.to_rgb(matplotlib.colors.cnames[x])))
colorNbr = len(colorNames)
rowNbr = (colorNbr - 1) // columnNbr + 1
width = 1.0 / columnNbr
height = 1.0 / rowNbr
figure = pyplot.figure(figsize = (10, 10))
pyplot.gcf().subplots_adjust(0, 0, 1, 1)
axes = figure.add_subplot(111)
axes.set_frame_on(False)
axes.xaxis.set_visible(False)
axes.yaxis.set_visible(False)
for i in range(rowNbr):
y = 1 - (i + 1) * height
for j in range(columnNbr):
ind = j + columnNbr * i
if ind >= len(colorNames):
break
x = j * width
axes.add_artist(matplotlib.patches.Rectangle((x, y), width, height, color = colorNames[ind]))
(r, g, b) = matplotlib.colors.colorConverter.to_rgb(colorNames[ind])
Y = 0.2126 * r + 0.7152 * g + 0.0722 * b
if Y > 0.5:
textColor = 'black'
else:
textColor = 'white'
axes.text(x + width / 30, y + height / 2, colorNames[ind], color = textColor)
matplotlib.colors.colorConverter : objet singleton qui permet de convertir une couleur de n'importe quel format en triplet RGB :
- matplotlib.colors.colorConverter.to_rgb('r') : donne (1.0, 0.0, 0.0).
- matplotlib.colors.colorConverter.to_rgb('red') : donne (1.0, 0.0, 0.0).
- matplotlib.colors.colorConverter.to_rgb('#ff0000') : donne (1.0, 0.0, 0.0).
- matplotlib.colors.colorConverter.to_rgb('0.70') : donne (0.7, 0.7, 0.7).
Gammes de couleurs (color maps)
Utilisation d'une color map pour avoir des couleurs pour un nombre entre 0 et 1 :
- myMap = pyplot.get_cmap('winter')
- ensuite, on peut récupérer une couleur pour un nombre entre 0 et 1 : myColor = myMap(0.3)
Différentes types de color maps :
cmaps = [('sequentielles', ['viridis', 'plasma', 'inferno', 'magma', 'cividis',
'Greys', 'Purples', 'Blues', 'Greens', 'Oranges', 'Reds',
'YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu', 'BuPu',
'GnBu', 'PuBu', 'YlGnBu', 'PuBuGn', 'BuGn', 'YlGn',
'binary', 'gist_yarg', 'gist_gray', 'gray', 'bone', 'pink',
'spring', 'summer', 'autumn', 'winter', 'cool', 'Wistia',
'hot', 'afmhot', 'gist_heat', 'copper']),
('Divergentes', ['PiYG', 'PRGn', 'BrBG', 'PuOr', 'RdGy', 'RdBu',
'RdYlBu', 'RdYlGn', 'Spectral', 'coolwarm', 'bwr', 'seismic']),
('Cycliques', ['hsv', 'twilight', 'twilight_shifted']),
('Qualitatives', ['Pastel1', 'Pastel2', 'Paired', 'Accent',
'Dark2', 'Set1', 'Set2', 'Set3',
'tab10', 'tab20', 'tab20b', 'tab20c']),
('Diverses', ['ocean', 'gist_earth', 'terrain', 'gist_stern',
'gnuplot', 'gnuplot2', 'CMRmap', 'cubehelix', 'brg',
'gist_rainbow', 'rainbow', 'jet', 'nipy_spectral', 'gist_ncar'])]
gradient = numpy.linspace(0, 1, 256)
gradient = numpy.vstack((gradient, gradient))
nrows = sum([len(x[1]) for x in cmaps])
pyplot.figure(figsize = (6, nrows * 0.3))
n = 0
for categ, cms in cmaps:
for cm in cms:
n += 1
pyplot.subplot(nrows, 1, n)
pyplot.imshow(gradient, aspect = 'auto', cmap = cm)
pyplot.text(260, 0.8, cm, fontsize = 10)
pyplot.gcf().subplots_adjust(left = 0, bottom = 0, right = 0.8, top = 1)
pyplot.gca().set_axis_off()
- séquentielles : pour représenter une variable continue.
- divergentes : pour représenter une variable continue avec une valeur centrale (par exemple 0).
- cycliques : pour représenter une variable continue où la valeur minimale et maximale sont équivalente (même couleur)
- qualitatives : pour représenter une variable avec des valeurs discrètes.
- Pour chaque color map, il y a une color map renversée correspondante avec un suffixe '_r' : par exemple, viridis_r pour viridis
Color map custom :
- color map linéaire avec 2 segments : un premier segment de 0 à 0.5 où le rouge passe de 1 à 0 et le vert passe de 0 à 0 et un second où le rouge passe de 0 à 0 et le vert de 0 à 1. Le bleu passe de 0 à 0 sur tout l'intervalle [0, 1] :
myColorMap = matplotlib.colors.LinearSegmentedColormap('myMap', {'red': [[0, 1, 1], [0.5, 0, 0], [1, 0, 0]],
'green': [[0, 0, 0], [0.5, 0, 0], [1, 1, 1]], 'blue': [[0, 0, 0], [1, 0, 0]]})
- chaque couleur a une liste de valeurs (x[i], y1[i], y2[i]), i = 0,...,n
- les x[i] doivent être croissants avec x[0] = 0 and x[n] = 1
- l'intensité de la couleur (red par exemple) entre x[i] et x[i+1] varie linéairement de y2[i] à y1[i+1] (et y1[0] et y2[n] ne sont pas utilisés)
- pour visualiser le résultat :
gradient = numpy.linspace(-1, 1, 500)
gradient = numpy.vstack((gradient, gradient))
pyplot.imshow(gradient, aspect = 'auto', cmap = myColorMap)
pyplot.show()
- Autre exemple de color map custom plus simple : de rouge a vert (en passant par un melange des deux marron) : matplotlib.colors.LinearSegmentedColormap('myMap', {'red': [[0, 1, 1], [1, 0, 0]],'green': [[0, 0, 0], [1, 1, 1]], 'blue': [[0, 0, 0], [1, 0, 0]]})
Faire une color map custom qui est grise quand la valeur n'est pas définie :
colorMap = matplotlib.cm.get_cmap('Blues').copy()
colorMap.set_bad('gray')
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert