Faire dans le Matshow, ça plaît aux filles
Sommaire
Lors d'une séance de TP, j'ai montré comment représenter graphiquement une matrice comme un grille de pixels. En effet, une matrice est une grille de nombres. Si chaque nombre est représenté par une couleur, on obtient une belle grille de couleurs, c'est-à-dire une mosaïque. Ça a beaucoup plu aux filles du groupe du TP. Remarque de macho ? Ça tombe bien, la commande pour faire cela est aussi matshow. Regradons :
Les prérequis
je commence par faire une importation du module des commandes graphiques
import matplotlib.pyplot as plt
Je passe en mode interactif :
%matplotlib inline
Remarque. Ceux qui ont une console interactive dans Spyder n'ont rien à faire. Ceux qui ont une console python non interactive (ça se reconnaît par un prompt ressemblant à \(>>>\)) devront taper dans leur console :
plt.ion() # ion veut dire : interactive on
Je charge le module dédié aux matrices :
import numpy as np
Regardons par exemple la matrice \(I_4\) identité d'ordre 4 :
I4 = np.eye(4) print I4
[[ 1. 0. 0. 0.] [ 0. 1. 0. 0.] [ 0. 0. 1. 0.] [ 0. 0. 0. 1.]]
Rencontre avec Matshow
Voici la mosaïque représentant
plt.matshow(I4)
<matplotlib.image.AxesImage at 0x10994e1d0>
Pourquoi le Matshow plaît aux filles ?
Réponse : parce que vous pouvez changer la carte des couleurs. Prenons une grosse matrice :
Regardons à quoi elle ressemble dans la carte des couleurs standard :
M = np.arange(1,1001).reshape(10,100) plt.matshow(M)
<matplotlib.image.AxesImage at 0x109ba7290>
Quelles sont les cartes de couleur ?
Il y a un tas de cartes disponibles nous dit la doc :
Spectral, summer, coolwarm, Wistia_r, pink_r, Set1, Set2, Set3, brg_r, Dark2, prism, PuOr_r, afmhot_r, terrain_r, PuBuGn_r, RdPu, gist_ncar_r, gist_yarg_r, Dark2_r, YlGnBu, RdYlBu, hot_r, gist_rainbow_r, gist_stern, PuBu_r, cool_r, cool, gray, copper_r, Greens_r, GnBu, gist_ncar, spring_r, gist_rainbow, gist_heat_r, Wistia, OrRd_r, CMRmap, bone, gist_stern_r, RdYlGn, Pastel2_r, spring, terrain, YlOrRd_r, Set2_r, winter_r, PuBu, RdGy_r, spectral, rainbow, flag_r, jet_r, RdPu_r, gist_yarg, BuGn, Paired_r, hsv_r, bwr, cubehelix, Greens, PRGn, gist_heat, spectral_r, Paired, hsv, Oranges_r, prism_r, Pastel2, Pastel1_r, Pastel1, gray_r, jet, Spectral_r, gnuplot2_r, gist_earth, YlGnBu_r, copper, gist_earth_r, Set3_r, OrRd, gnuplot_r, ocean_r, brg, gnuplot2, PuRd_r, bone_r, BuPu, Oranges, RdYlGn_r, PiYG, CMRmap_r, YlGn, binary_r, gist_gray_r, Accent, BuPu_r, gist_gray, flag, bwr_r, RdBu_r, BrBG, Reds, Set1_r, summer_r, GnBu_r, BrBG_r, Reds_r, RdGy, PuRd, Accent_r, Blues, autumn_r, autumn, cubehelix_r, nipy_spectral_r, ocean, PRGn_r, Greys_r, pink, binary, winter, gnuplot, RdYlBu_r, hot, YlOrBr, coolwarm_r, rainbow_r, Purples_r, PiYG_r, YlGn_r, Blues_r, YlOrBr_r, seismic, Purples, seismic_r, RdBu, Greys, BuGn_r, YlOrRd, PuOr, PuBuGn, nipy_spectral, afmhot.
Un bon exercice : montrez-nous toutes ces cartes
Au lieu de tester ces cartes une par une à la main, je vais demander à Python de le faire. Pour cela, je vais créer la liste contenant le nom de toutes ces cartes et construire une boucle sur cette liste :
cartes = 'Spectral, summer, coolwarm, Wistia_r, pink_r, Set1, Set2, Set3, brg_r, Dark2, prism, PuOr_r, afmhot_r, terrain_r, PuBuGn_r, RdPu, gist_ncar_r, gist_yarg_r, Dark2_r, YlGnBu, RdYlBu, hot_r, gist_rainbow_r, gist_stern, PuBu_r, cool_r, cool, gray, copper_r, Greens_r, GnBu, gist_ncar, spring_r, gist_rainbow, gist_heat_r, Wistia, OrRd_r, CMRmap, bone, gist_stern_r, RdYlGn, Pastel2_r, spring, terrain, YlOrRd_r, Set2_r, winter_r, PuBu, RdGy_r, spectral, rainbow, flag_r, jet_r, RdPu_r, gist_yarg, BuGn, Paired_r, hsv_r, bwr, cubehelix, Greens, PRGn, gist_heat, spectral_r, Paired, hsv, Oranges_r, prism_r, Pastel2, Pastel1_r, Pastel1, gray_r, jet, Spectral_r, gnuplot2_r, gist_earth, YlGnBu_r, copper, gist_earth_r, Set3_r, OrRd, gnuplot_r, ocean_r, brg, gnuplot2, PuRd_r, bone_r, BuPu, Oranges, RdYlGn_r, PiYG, CMRmap_r, YlGn, binary_r, gist_gray_r, Accent, BuPu_r, gist_gray, flag, bwr_r, RdBu_r, BrBG, Reds, Set1_r, summer_r, GnBu_r, BrBG_r, Reds_r, RdGy, PuRd, Accent_r, Blues, autumn_r, autumn, cubehelix_r, nipy_spectral_r, ocean, PRGn_r, Greys_r, pink, binary, winter, gnuplot, RdYlBu_r, hot, YlOrBr, coolwarm_r, rainbow_r, Purples_r, PiYG_r, YlGn_r, Blues_r, YlOrBr_r, seismic, Purples, seismic_r, RdBu, Greys, BuGn_r, YlOrRd, PuOr, PuBuGn, nipy_spectral, afmhot,'
print cartes
Spectral, summer, coolwarm, Wistia_r, pink_r, Set1, Set2, Set3, brg_r, Dark2, prism, PuOr_r, afmhot_r, terrain_r, PuBuGn_r, RdPu, gist_ncar_r, gist_yarg_r, Dark2_r, YlGnBu, RdYlBu, hot_r, gist_rainbow_r, gist_stern, PuBu_r, cool_r, cool, gray, copper_r, Greens_r, GnBu, gist_ncar, spring_r, gist_rainbow, gist_heat_r, Wistia, OrRd_r, CMRmap, bone, gist_stern_r, RdYlGn, Pastel2_r, spring, terrain, YlOrRd_r, Set2_r, winter_r, PuBu, RdGy_r, spectral, rainbow, flag_r, jet_r, RdPu_r, gist_yarg, BuGn, Paired_r, hsv_r, bwr, cubehelix, Greens, PRGn, gist_heat, spectral_r, Paired, hsv, Oranges_r, prism_r, Pastel2, Pastel1_r, Pastel1, gray_r, jet, Spectral_r, gnuplot2_r, gist_earth, YlGnBu_r, copper, gist_earth_r, Set3_r, OrRd, gnuplot_r, ocean_r, brg, gnuplot2, PuRd_r, bone_r, BuPu, Oranges, RdYlGn_r, PiYG, CMRmap_r, YlGn, binary_r, gist_gray_r, Accent, BuPu_r, gist_gray, flag, bwr_r, RdBu_r, BrBG, Reds, Set1_r, summer_r, GnBu_r, BrBG_r, Reds_r, RdGy, PuRd, Accent_r, Blues, autumn_r, autumn, cubehelix_r, nipy_spectral_r, ocean, PRGn_r, Greys_r, pink, binary, winter, gnuplot, RdYlBu_r, hot, YlOrBr, coolwarm_r, rainbow_r, Purples_r, PiYG_r, YlGn_r, Blues_r, YlOrBr_r, seismic, Purples, seismic_r, RdBu, Greys, BuGn_r, YlOrRd, PuOr, PuBuGn, nipy_spectral, afmhot,
Évidemment, on n'a qu'une chaîne de caractères ici. Je vais séparer (splitter) les mots de la chaîne :
liste1 = cartes.split()
print liste1
['Spectral,', 'summer,', 'coolwarm,', 'Wistia_r,', 'pink_r,', 'Set1,', 'Set2,', 'Set3,', 'brg_r,', 'Dark2,', 'prism,', 'PuOr_r,', 'afmhot_r,', 'terrain_r,', 'PuBuGn_r,', 'RdPu,', 'gist_ncar_r,', 'gist_yarg_r,', 'Dark2_r,', 'YlGnBu,', 'RdYlBu,', 'hot_r,', 'gist_rainbow_r,', 'gist_stern,', 'PuBu_r,', 'cool_r,', 'cool,', 'gray,', 'copper_r,', 'Greens_r,', 'GnBu,', 'gist_ncar,', 'spring_r,', 'gist_rainbow,', 'gist_heat_r,', 'Wistia,', 'OrRd_r,', 'CMRmap,', 'bone,', 'gist_stern_r,', 'RdYlGn,', 'Pastel2_r,', 'spring,', 'terrain,', 'YlOrRd_r,', 'Set2_r,', 'winter_r,', 'PuBu,', 'RdGy_r,', 'spectral,', 'rainbow,', 'flag_r,', 'jet_r,', 'RdPu_r,', 'gist_yarg,', 'BuGn,', 'Paired_r,', 'hsv_r,', 'bwr,', 'cubehelix,', 'Greens,', 'PRGn,', 'gist_heat,', 'spectral_r,', 'Paired,', 'hsv,', 'Oranges_r,', 'prism_r,', 'Pastel2,', 'Pastel1_r,', 'Pastel1,', 'gray_r,', 'jet,', 'Spectral_r,', 'gnuplot2_r,', 'gist_earth,', 'YlGnBu_r,', 'copper,', 'gist_earth_r,', 'Set3_r,', 'OrRd,', 'gnuplot_r,', 'ocean_r,', 'brg,', 'gnuplot2,', 'PuRd_r,', 'bone_r,', 'BuPu,', 'Oranges,', 'RdYlGn_r,', 'PiYG,', 'CMRmap_r,', 'YlGn,', 'binary_r,', 'gist_gray_r,', 'Accent,', 'BuPu_r,', 'gist_gray,', 'flag,', 'bwr_r,', 'RdBu_r,', 'BrBG,', 'Reds,', 'Set1_r,', 'summer_r,', 'GnBu_r,', 'BrBG_r,', 'Reds_r,', 'RdGy,', 'PuRd,', 'Accent_r,', 'Blues,', 'autumn_r,', 'autumn,', 'cubehelix_r,', 'nipy_spectral_r,', 'ocean,', 'PRGn_r,', 'Greys_r,', 'pink,', 'binary,', 'winter,', 'gnuplot,', 'RdYlBu_r,', 'hot,', 'YlOrBr,', 'coolwarm_r,', 'rainbow_r,', 'Purples_r,', 'PiYG_r,', 'YlGn_r,', 'Blues_r,', 'YlOrBr_r,', 'seismic,', 'Purples,', 'seismic_r,', 'RdBu,', 'Greys,', 'BuGn_r,', 'YlOrRd,', 'PuOr,', 'PuBuGn,', 'nipy_spectral,', 'afmhot,']
C'est mieux, mais j'ai ces virgules dans les noms des cartes qui me gênent... Heureusement, les listes en compréhension me sauvent :
liste2 = [ mot[:-1] for mot in liste1] print liste2
['Spectral', 'summer', 'coolwarm', 'Wistia_r', 'pink_r', 'Set1', 'Set2', 'Set3', 'brg_r', 'Dark2', 'prism', 'PuOr_r', 'afmhot_r', 'terrain_r', 'PuBuGn_r', 'RdPu', 'gist_ncar_r', 'gist_yarg_r', 'Dark2_r', 'YlGnBu', 'RdYlBu', 'hot_r', 'gist_rainbow_r', 'gist_stern', 'PuBu_r', 'cool_r', 'cool', 'gray', 'copper_r', 'Greens_r', 'GnBu', 'gist_ncar', 'spring_r', 'gist_rainbow', 'gist_heat_r', 'Wistia', 'OrRd_r', 'CMRmap', 'bone', 'gist_stern_r', 'RdYlGn', 'Pastel2_r', 'spring', 'terrain', 'YlOrRd_r', 'Set2_r', 'winter_r', 'PuBu', 'RdGy_r', 'spectral', 'rainbow', 'flag_r', 'jet_r', 'RdPu_r', 'gist_yarg', 'BuGn', 'Paired_r', 'hsv_r', 'bwr', 'cubehelix', 'Greens', 'PRGn', 'gist_heat', 'spectral_r', 'Paired', 'hsv', 'Oranges_r', 'prism_r', 'Pastel2', 'Pastel1_r', 'Pastel1', 'gray_r', 'jet', 'Spectral_r', 'gnuplot2_r', 'gist_earth', 'YlGnBu_r', 'copper', 'gist_earth_r', 'Set3_r', 'OrRd', 'gnuplot_r', 'ocean_r', 'brg', 'gnuplot2', 'PuRd_r', 'bone_r', 'BuPu', 'Oranges', 'RdYlGn_r', 'PiYG', 'CMRmap_r', 'YlGn', 'binary_r', 'gist_gray_r', 'Accent', 'BuPu_r', 'gist_gray', 'flag', 'bwr_r', 'RdBu_r', 'BrBG', 'Reds', 'Set1_r', 'summer_r', 'GnBu_r', 'BrBG_r', 'Reds_r', 'RdGy', 'PuRd', 'Accent_r', 'Blues', 'autumn_r', 'autumn', 'cubehelix_r', 'nipy_spectral_r', 'ocean', 'PRGn_r', 'Greys_r', 'pink', 'binary', 'winter', 'gnuplot', 'RdYlBu_r', 'hot', 'YlOrBr', 'coolwarm_r', 'rainbow_r', 'Purples_r', 'PiYG_r', 'YlGn_r', 'Blues_r', 'YlOrBr_r', 'seismic', 'Purples', 'seismic_r', 'RdBu', 'Greys', 'BuGn_r', 'YlOrRd', 'PuOr', 'PuBuGn', 'nipy_spectral', 'afmhot']
Super ! Au fait, ça fait combien de cartes de couleurs ?
len(liste2)
144
144 cartes.
Regardons enfin les cartes
Je vais constuire ma boucle, qui va m'afficher 144 fois la matrice \(M\) dans ses déclinaisons de couleurs :
for carte in liste2: plt.matshow(M, cmap = carte ) plt.title('carte : ' + carte)