Modules graphiques Python en Avril - matplotlib et turtle !
Posté le 03/02/2020 22:13
Bonne nouvelle, Casio-fans ! Vos voeux les plus fous de modules graphiques Python sont probablement sur le point d'être exaucés.
Olivier Lecluse, sur Twitter, a écrit :Idéalement on pourrait imaginer que les plotlib soient des sous parties de matplotlib, qui est un peu le standard en python, ce qui assurerait une certaine cohérence. Sait-on si c'est le cas avec ti-plotlib?
(
source)
Eh bien oui, Casio a fait attention à la compatibilité pour ses modules Python. Le module de tracé, qui permet de
« programmer l’affichage de tracés en classe de mathématiques comme de physique », est conforme à l'API du module
pyplot de
matplotlib, un projet très populaire et le standard
de facto pour le tracé en Python.
Le module de tracé, façon matplotlib
Dans sa
dernière newsletter datée du 10 Janvier, Casio nous montre en effet à la fois des images, mais aussi du code. Comme on va le voir tout de suite, le même code marche sur PC comme sur calculatrice à condition de changer le nom de module Casio
matplotl en
matplotlib.pyplot.
La newsletter annonce :
• Des fonctions de matplotlib:
bar(),
scatter(),
boxplot(),
arrow(), et
plot().
• Une fonction exclusive:
boxplotFR(), pour les diagrammes en boîtes à moustache avec les quartiles français.
Et voici les exemples proposés, avec la comparaison entre la calculatrice et le PC.
from matplotl import *
arrow(0.20, 0.54, 0, -0.1)
arrow(0.30, 0.46, 0, -0.1)
arrow(0.40, 0.59, 0, -0.1)
show()
from matplotl import *
x=[100,110,120,130,140,150,160]
y=[105,95,75,68,53,46,31]
scatter(x,y)
axis([80,170,10,130])
text(110,125,"Nombre d'acheteurs vs prix de vente")
show()
from matplotlib.pyplot import *
def f(x):
return x**3-6*x**2+9*x+1
start = -0.5
end = 4.5
steps = 0.1
x=[start+i*steps for i in range(int((end-start)/steps)+1)]
y=[f(j) for j in x]
plot(x,y)
show()
from matplotlib.pyplot import *
x=[119.1,119.3,119.5,119.6,119.9,120.0,120.1,120.3,120.4]
y=[1,3,4,3,1,3,1,3,1]
bar(x,y,0.08)
show()
Eh ben wow, c'est vraiment réussi ! On dirait presque un portage en règle. La compatibilité est juste totale.
Dessin glouton avec le module turtle
L'autre module présenté (celui qui vaut le pluriel dans le nom de cet article) c'est
turtle. Celui-ci est vraiment identique à la version qu'on trouve sur ordinateur, jusqu'au nom. Il ressemble beaucoup au langage de programmation du menu algorithm de la fx-92 Scientifique Collège+... mais en Python.
On y retrouve plein de fonctions bien connues !
•
pendown(),
penup(),
pencolor() et
pensize() pour modifier les paramètres du crayon.
•
forward(),
backward(),
right(),
left() et
goto() pour se déplacer (et dessiner si le crayon est en position basse).
• Et même
setheading() et
circle() !
Voici la comparaison avec le PC pour les exemples qui sont proposés.
from math import exp
from turtle import *
for i in range(1,37):
red=(exp(-0.5*((i-6)/12)**2))
green=(exp(-0.5*((i-18)/12)**2))
blue=(exp(-0.5*((i-30)/12)**2))
pencolor([red,green,blue])
for i in range(1,5):
forward(60)
right(90)
right(10)
from turtle import *
def koch(n,l):
if n==0:
forward(l)
else:
koch(n-1,l/3)
left(60)
koch(n-1,l/3)
right(120)
koch(n-1,l/3)
left(60)
koch(n-1,l/3)
pencolor("blue")
penup()
goto(-180,-50)
pendown()
koch(4,360)
Comme vous pouvez le voir, tous ces modules sont vraiment fidèles aux bibliothèques Python déjà répandues.
Date de sortie et installation
La newsletter annonce une
date de sortie en Avril et donne déjà des instructions d'installation !
Pour pouvoir utiliser ces nouvelles commandes sur votre calculatrice Graph 35+E II ou Graph 90+E, il vous suffira de la mettre à jour en
avril avec la bibliothèque
casioplot, puis d’ajouter les programmes matplotl et turtle (téléchargeables gratuitement sur
www.casio-education.fr).
Les calculatrices Graph 35+E II et Graph 90+E se comportant comme des clés USB, vous pouvez toujours transférer, via un simple copier-coller, un fichier Python de votre calculatrice à l’ordinateur et inversement. Pas besoin de logiciel de transfert ou de conversion ! Et si vous souhaitez utiliser les programmes graphiques créés sur votre calculatrice, sur votre ordinateur, il vous suffira simplement de remplacer sur vos scripts le nom de la bibliothèque matplotl par matplotlib.
D'après ces instructions, il y aura deux composants:
une bibliothèque casioplot, et deux scripts matplotl.py et turtle.py. Cela expliquerait pourquoi le nom du module de tracé a été raccourci de matplotlib à juste matplotl : les noms de fichiers sur les Graph sont limités à 8 caractères !
Le nom casioplot laisse à penser que le coeur de la bibliothèque est spécifique aux calculatrices Casio et partagée entre les deux modules matplotl et turtle. Casio a donc codé ses propres fonctions, mais a quand même tenu à respecter les APIs répandues du Python pour plus de compatibilité ! Eh bien merci !
Le bonus : scripts compatibles calto/PC sans modification
Comme le nom du module est différent entre la calculatrice et le PC, on peut penser qu'un même programme ne peut pas être lancé sur les deux sans modification. Heureusement, Python a tout prévu ! Si on tente d'importer un module qui n'existe pas, une
ImportError se produit. On peut le détecter et alors charger l'autre module au besoin !
try:
from matplotl import *
except ImportError:
from matplotlib.pyplot import *
Je vous laisse imaginer de quoi jouer avec cette technique, qui permet aussi de détecter les différents modèles de calculatrices (par exemple en important tiplotlib sur TI ou kandinsky sur Numworks) !
Article connexe sur TI-Planet :
matplotlib.pyplot + turtle dans ton Python Casio; avril 2020
À bientôt sur Planète Casio !
Fichier joint
Citer : Posté le 05/04/2020 23:05 | #
Des mises à jour surprise ? J'en doute, pour être honnête. S'il doit y avoir des interfaces graphiques (eg. entrées clavier) en Python ça viendra après.
Citer : Posté le 06/04/2020 07:59 | #
Sont vraiment lents
-Planétarium 2
Citer : Posté le 07/04/2020 12:05 | #
Maintenant, petit test de compatibilité Casio / NumWorks / ordi, autour du module turtle.
Basé sur les exemples fournis et illustrés par Casio, nous ne disposons pas de préversion de l'OS.
On commence par une petite rosace; tout possesseur de Graph 35+E II sait que Casio adore ça :
speed(0)
for i in range(12):
left(30)
for i in range(8):
forward(30)
left(45)
Le code d'exemple fourni par Casio passe ici sans problème sur NumWorks et sur ordi.
On poursuit maintenant avec le flocon de Koch :
def koch(n, l):
if n==0:
forward(l)
else:
koch(n-1, l/3)
left(60)
koch(n-1, l/3)
right(120)
koch(n-1, l/3)
left(60)
koch(n-1, l/3)
pencolor("blue")
penup()
goto(-180, -50)
pendown()
koch(4, 360)
Ici encore aucun problème, compatibilité totale !
Nous arrivons maintenant à un soleil. Mais ici hélas, le code de Casio ne marche pas sur NumWorks :
from turtle import *
for i in range(1,37):
red=(exp(-0.5 * ((i-6)/12)**2))
green=(exp(-0.5 * ((i-18)/12)**2))
blue=(exp(-0.5 * ((i-30)/12)**2))
pencolor([red, green, blue])
for i in range(1, 5):
forward(60)
right(90)
right(10)
Le problème semble ici être que la Casio et la NumWorks n'utilisent pas par défaut le même système de coordonnées pour les composantes couleurs en turtle :
- nombre flottant de 0.0 à 1.0 sur Casio
- nombre entier de 0 à 255 sur NumWorks
Qui a raison ? Il semble que ce soit Casio, l'ordinateur n'ayant aucun problème à exécuter ce code, vive Casio !
Notons que sur les implémentations Python complètes on peut régler le comportement souhaité à l'aide des appels respectifs turtle.colormode(1.0) et turtle.colormode(255).
Toutefois cette fonction n'est hélas pas incluse chez NumWorks.
En conséquence, nous proposons le code corrigé ci-dessous, avec une fonction intermédiaire mypencolor() qui corrigera les coordonnées si nécessaire, et qui à la différence marchera aussi sur NumWorks :
from turtle import *
def mypencolor(t):
cmax = 255
try:
pencolor((2, 2, 2))
except:
cmax = 1
if(cmax == 1 and max(t)>1):
t = tuple(u/255 for u in t)
elif(cmax == 255 and any(isinstance(u, float) for u in t)):
t=tuple(int(255*u) for u in t)
pencolor(t)
for i in range(1,37):
red=(exp(-0.5 * ((i-6)/12)**2))
green=(exp(-0.5 * ((i-18)/12)**2))
blue=(exp(-0.5 * ((i-30)/12)**2))
mypencolor([red, green, blue])
for i in range(1, 5):
forward(60)
right(90)
right(10)
Enfin nous terminons avec une coquille d'escargot et malheureusement même problème, le code de Casio marche partout sauf sur NumWorks :
from math import *
penup()
goto(0, -20)
pendown()
for i in range(1,37):
red=(exp(-0.5 * ((i-6)/12)**2))
green=(exp(-0.5 * ((i-18)/12)**2))
blue=(exp(-0.5 * ((i-30)/12)**2))
pencolor([red,green,blue])
circle(50-i)
right(10)
En conséquence, même correction en attendant mieux :
from math import *
def mypencolor(t):
cmax = 255
try:
pencolor((2, 2, 2))
except:
cmax = 1
if(cmax == 1 and max(t)>1):
t = tuple(u/255 for u in t)
elif(cmax == 255 and any(isinstance(u, float) for u in t)):
t=tuple(int(255*u) for u in t)
pencolor(t)
penup()
goto(0, -20)
pendown()
for i in range(1,37):
red=(exp(-0.5 * ((i-6)/12)**2))
green=(exp(-0.5 * ((i-18)/12)**2))
blue=(exp(-0.5 * ((i-30)/12)**2))
mypencolor([red,green,blue])
circle(50-i)
right(10)
Même si il faut encore faire des efforts, c'est génial d'avoir enfin une certaine compatibilité graphique de plus standard sur nos calculatrices !
Ajouté le 07/04/2020 à 12:15 :
Et nouveau test comparatif avec un script d'exemple turtle tout frais fourni par Casio :
forward(40)
backward(100)
left(90)
forward(30)
right(60)
forward(60)
right(30)
forward(30)
penup()
forward(18);right(90);forward(60)
pendown()
right(30);backward(30);right(60);forward(60)
pencolor("orange")
pencolor("mangenta")
pencolor("red")
penup()
goto(80,40)
right(140);pendown()
circle(30)
penup();goto(105,50);pencolor("green");pendown()
circle(-50)
penup();pencolor("red");right(21);goto(60,20);pendown()
circle(40,60)
penup();pencolor("blue");goto(-50,15);setheading(0);pendown()
write("CASIO")
Un script en l'honneur de la superbe Graph 90+E !
Les Casio se comportent apparemment aussi bien que l'ordi.
Plusieurs problèmes par contre sur NumWorks, qui :
- d'une part ne gère pas l'astuce de passer un paramètre négatif à circle() pour changer le sens de tracer, alors que pourtant bien géré sur ordi et Casio
- d'autre part n'inclut apparemment pas l'instruction d'écriture de texte write()
Citer : Posté le 07/04/2020 15:20 | #
Eh bien, Casio a fait fort sur ce coup-là. Ils ont visé la compatibilité bien comme il faut et pas lésiné. C'est génial !
Citer : Posté le 07/04/2020 15:48 | #
Merci pour ta réponse.
Justement je voulais savoir si je peux à ton avis mettre ces tests en page d'accueil, ou si il vaut mieux laisser le vote du JdM à la une encore quelques temps.
Citer : Posté le 07/04/2020 15:48 | #
Non, je pense que tu peux y aller. Si tu as le temps profite-en pour raconter brièvement la formation en ligne
Citer : Posté le 07/04/2020 15:51 | #
Merci.
C'est demain la tournée pédagogique lycée.
Même pas sûr que je puisse y aller dans les conditions actuelles...
Citer : Posté le 07/04/2020 15:59 | #
C'est très encourageant et Casio a plutôt intérêt à faire ça ! Je veux dire, s'il veut que les étudiants puissent utiliser les programmes Casio directement sur ordinateur (ou vice-versa), il se doit de proposer une compatibilité complète
Citer : Posté le 15/06/2020 10:48 | #
J'ai besoin de dessiner quelque chose en utilisant le module tortue sur la même toile sur laquelle un graphique serait tracé.
J'ai pensé à utiliser matplotlib pour faire un graphique, mais je dois dessiner plus tard quelque chose avec tortue sur ce graphique. Je pourrais dessiner le graphique et les autres choses avec la tortue, mais c'est beaucoup plus compliqué.
Quelqu'un peut-il penser à une meilleure façon?
Citer : Posté le 15/06/2020 10:52 | #
Bonjour
Tu peux préciser ? J'ai pas compris…
Citer : Posté le 15/06/2020 11:34 | #
Il veut dessiner sur un graphe matplotlib
-Planétarium 2
Citer : Posté le 15/06/2020 11:47 | #
Tu peux utiliser matplotlib pour dessiner un ensemble de lignes... ce n'est pas forcément très performant mais si ton dessin est mineur ça devrait aller.
Invité
Citer : Posté le 11/02/2021 14:46 | #
J'essaie de créer un script python qui me permettra d'utiliser turtle pour tracer une fonction comme y = 0,5x + 3. Comment cela peut-il être fait?
[Lien supprimé]
Citer : Posté le 11/02/2021 16:54 | #
Salut, qu'as-tu essayé exactement ?
Une réponse utilisant matplot est dans l'article, il suffit de modifier le polynôme de degré 3 en ta fonction affine.
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 11/02/2021 18:20 | #
Pour le faire avec turtle, il y a essentiellement deux étapes. D'abord, tu dois choisir quelle partie du graphe tu représentes à l'écran : les valeurs de x (minimum et maximum) et les valeurs de y (pareil). Comme ça, tu peux passer des coordonnées du graphe aux coordonnées à l'écran.
Ensuite, tu dois évaluer ta fonction en certains points (par exemple 1 fois tous les 2 ou 3 pixels en x), et relier les points en avançant avec la tortue.