Table des matières

Faire un graphe polaire en python

Nous allons voir commetn faire plusieurs types de graph polaire en python pour, par exemple, afficher des données, faire apparaître des savoirs…

Avec matplotlib

Matplotlib est une bibliothèque de tracés Python en 2D pour des chiifres donnés. Pour générer des graphiques, des histogrammes, des spectres de puissance, des diagrammes à barres, des diagrammes d'erreurs, des diagrammes de dispersion, etc. avec seulement quelques lignes de code.

Dans cet exemple nous allons travailler sur la conception d'un graphique polaire visant à rendre visible les champs de compétences d'une personne.

Pour cela nous allons utiliser matplotlib.pyplot

Dans matplotlib.pyplot, différents états sont conservés dans les appels de fonctions, de sorte qu'il garde la trace de choses comme la figure actuelle et la zone de traçage, et les fonctions de traçage sont dirigées vers les axes actuels.

Subjectiver les champs d'activités pro

Nous utliserons également numpy pour afficher notre rendu graphique dans une image.

Installation matplotlib

$ sudo apt-get install python3-matplotlib # Debian / Ubuntu
$ sudo dnf install python3-matplotlib # Fedora 
$ sudo yum install python3-matplotlib # Red Hat
$ sudo pacman -S python-matplotlib # Arch

Afficher un graphique polaire

Dans un fichier que nous nommons polar_cv.py

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. """
  5. A Graphy CV for transdisciplanary human being
  6. by XavCC
  7. GNU GENERAL PUBLIC LICENSE Version 3
  8. """
  9.  
  10. import numpy as np
  11. import matplotlib.pyplot as plt
  12.  
  13. field = ['Arts', 'Sciences', 'Hacking', 'Engineering', 'Design']
  14. ecology = [
  15. 72, # Arts
  16. 78, # Sciences
  17. 80, # Hacking
  18. 92, # Engineering
  19. 92, # Design
  20. 72, # Arts
  21. ]
  22. digitaltech = [
  23. 65, # Arts
  24. 60, # Sciences
  25. 60, # Hacking
  26. 55, # Engineering
  27. 65, # Design
  28. 65, # Arts
  29. ]
  30. teaching = [
  31. 55, # Arts
  32. 62, # Sciences
  33. 70, # Hacking
  34. 82, # Engineering
  35. 82, # Design
  36. 55, # Arts
  37. ]
  38.  
  39. # Initialise the spider plot by setting figure size and polar projection
  40.  
  41. plt.figure(figsize=(10, 6))
  42. plt.subplot(polar=True)
  43.  
  44. theta = np.linspace(0, 2 * np.pi, len(ecology))
  45.  
  46. # Arrange the grid into number of capacties equal parts in degrees
  47.  
  48. (lines, labels) = plt.thetagrids(range(0, 360, int(360 / len(field))),
  49. field)
  50.  
  51. # Plot Ecology capacities graph
  52.  
  53. plt.plot(theta, ecology)
  54. plt.fill(theta, ecology, 'b', alpha=0.1)
  55.  
  56. # Plot Digital Techn capacities graph
  57.  
  58. plt.plot(theta, digitaltech)
  59.  
  60. # Plot Teaching capacities graph
  61.  
  62. plt.plot(theta, teaching)
  63.  
  64. # Add legend and title for the plot
  65.  
  66. plt.legend(labels=('Ecology', 'Digital Tech', 'Teaching'), loc= 4)
  67. plt.title('My Graphy CV for transdisciplanary human being')
  68.  
  69. plt.show()
  70.  

Ce qui avec la commande $ python3 polar_cv.py nous donne

Verifier le standard du code

Installons pylint

$ sudo pip3 install pylint
Vérifions la qualité de notre substance nouvellement créée. Traquons les fautes de syntaxe ou de frappe, le style de notre code, en suivant les recommandations de style du langage Python (PEP8). Pour réaliser cela pylint est plus précis et plus verbeux que pep8 ou flake8 ou encore pycodestyle.

ensuite

`--> pylint polar_cv.py 
************* Module polar_cv
cv_graphy.py:66:62: C0326: No space allowed after keyword argument assignment
plt.legend(labels=('Ecology', 'Digital Tech', 'Teaching'), loc= 4)
                                                              ^ (bad-whitespace)
cv_graphy.py:13:0: C0103: Constant name "field" doesn't conform to UPPER_CASE naming style (invalid-name)
cv_graphy.py:14:0: C0103: Constant name "ecology" doesn't conform to UPPER_CASE naming style (invalid-name)
cv_graphy.py:22:0: C0103: Constant name "digitaltech" doesn't conform to UPPER_CASE naming style (invalid-name)
cv_graphy.py:30:0: C0103: Constant name "teaching" doesn't conform to UPPER_CASE naming style (invalid-name)
cv_graphy.py:44:0: C0103: Constant name "theta" doesn't conform to UPPER_CASE naming style (invalid-name)
cv_graphy.py:48:1: C0103: Constant name "lines" doesn't conform to UPPER_CASE naming style (invalid-name)
cv_graphy.py:48:8: C0103: Constant name "labels" doesn't conform to UPPER_CASE naming style (invalid-name)

------------------------------------------------------------------
Your code has been rated at 5.29/10 (previous run: 5.88/10, -0.59)

Nous avons :

Pour s'affranchir des problèmes de pylint qui voudrait des majuscules, exécutons la règle en utilisant l’option –const-rgx='[a-z\_][a-z0-9\_]{2,30}$'

Ce qui nous donne

`--> pylint --const-rgx='[a-z\_][a-z0-9\_]{2,30}$' polar_cv.py

-------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: 5.29/10, +4.71)

Corrigeons les erreurs graphiques

  1. La legende est placée de manière non optimum pour la lecture
  2. les mots Ingineering et hacking empiètent sur le graphique

La légende

Dans notre exemple elle est écrite

plt.legend(labels=('Ecology', 'Digital Tech', 'Teaching'), loc=4)

L'emplacement de la légende peut être spécifié par le mot-clé argument loc (documentation de legend() pour plus de détails.)

Le mot-clé bbox_to_anchor donne un grand degré de contrôle pour le placement manuel des légendes.

Parametres:

loc : int or string or pair of floats, default: ‘upper right’

* The location of the legend. Possible codes are:

Location String Location Code
best 0
upper right 1
upper left 2
lower left 3
lower right 4
right 5
center left 6
center right 7
lower center 8
upper center 9
center 10

Alternativement, il peut s'agir d'un x, y à 2-tuple donnant x, y du coin inférieur gauche de la légende en coordonnées d'axes (auquel cas bbox_to_anchor sera ignoré).

Dans le but de fluidifier la lecture (passage du regard en diagonal sur l'interface) et de faire ressortir clairement les informations contenues dans la légénde, nou sprenons l'option de la placer en abs à droite entre Arts et Design et légèrement à cheval sur le graphique des données.

Nous remplaçons donc loc= 4 par bbox_to_anchor=(0.9, 0.4)

Pimp de style

matpotlib contient un package style qui ajoute le support des “styles” de traçage faciles à changer avec les mêmes paramètres qu'un fichier matplotlibrc (est lu au démarrage pour configurer matplotlib).

Il existe un certain nombre de styles prédéfinis fournis par matplotlib. Pour les obtenir

$ python3
>>> import matplotlib.pyplot as plt
>>> print(plt.style.available)
['seaborn-colorblind', 'seaborn-white', 'seaborn-paper', 'seaborn-deep', 'grayscale', 'seaborn', 'seaborn-dark-palette', 'seaborn-notebook', 'seaborn-ticks', 'seaborn-whitegrid', 'dark_background', 'bmh', 'seaborn-muted', 'seaborn-bright', 'fast', 'Solarize_Light2', 'classic', 'seaborn-poster', 'fivethirtyeight', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-pastel', 'seaborn-talk', '_classic_test', 'ggplot']

Par exemple, il existe un style prédéfini que l'on peut uitliser en début de module tel que

import numpy as np
import matplotlib.pyplot as plt
 
# set plot style
plt.style.use('seaborn-notebook')

Avec 'greyscale'

Avec 'seaborn-white'

Police de caractères

plt.title('My Graphy CV for transdisciplanary human being', fontsize=20, family='cmtt10')

En utilisant tick_params, afin de pouvoir modifier si l'on désir : emplacement, taille, couleur…

Par exemple :

plt.tick_params(direction='out', length=6, width=4, labelcolor='#911C14')</code

Autre représentation

I-A. IPython et le mode pylab ▲

IPython est une console interactive Python améliorée qui supporte un grand nombre de fonctionnalités très intéressantes parmi lesquelles les entrées/sorties nommées, l'utilisation directe de commandes shell, un système de débogage amélioré et bien plus encore.

En lançant cette console avec l'argument -pylab (–pylab depuis IPython version 0.12), l'on dispose immédiatement d'une session matplotlib interactive avec de nombreuses fonctionnalités du type Matlab™ / Mathematica™. I-B. Pylab ▲

Pylab fournit une interface procédurale à la librairie graphique matplotlib orientée objet. Elle est basée sur un modèle très proche de Matlab™. De la sorte, la grande majorité des commandes pylab ont leur équivalent Matlab™ avec des arguments similaires. Les commandes les plus importantes sont expliquées avec des exemples en console interactive.

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from pylab import *
 
ax = axes([0.025, 0.025, 0.95, 0.95], polar=True)
 
N = 20
theta = np.arange(0.0, 2 * np.pi, 2 * np.pi / N)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
bars = bar(theta, radii, width=width, bottom=0.0)
 
for (r, bar) in zip(radii, bars):
    bar.set_facecolor(cm.jet(r / 10.))
    bar.set_alpha(0.5)
 
ax.set_xticklabels([])
ax.set_yticklabels([])
 
show()

Autres Ressources externes