Mis a jour le 2025-04-14, 12:10

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')
  
Pour utiliser certaines couleurs d'une color map :
colorMap = matplotlib.colormaps['hsv']
colors = [colorMap(x) for x in [0, 0.1, 0.2, 0.3, 0.4]] # (valeurs entre 0 et 1)
  

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert