Graphiques#

Sage peut produire des graphiques en deux ou trois dimensions.

Graphiques en deux dimensions#

En deux dimensions, Sage est capable de tracer des cercles, des droites, des polygones, des graphes de fonctions en coordonnées cartésiennes, des graphes en coordonnées polaires, des lignes de niveau et des représentations de champs de vecteurs. Nous présentons quelques exemples de ces objets ici. Pour plus d’exemples de graphiques avec Sage, on consultera Résolution des équations différentielles, Maxima et aussi la documentation Sage Constructions

La commande suivante produit un cercle jaune de rayon 1 centré à l’origine :

sage: circle((0,0), 1, rgbcolor=(1,1,0))
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> circle((Integer(0),Integer(0)), Integer(1), rgbcolor=(Integer(1),Integer(1),Integer(0)))
Graphics object consisting of 1 graphics primitive

Il est également possible de produire un disque plein :

sage: circle((0,0), 1, rgbcolor=(1,1,0), fill=True)
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> circle((Integer(0),Integer(0)), Integer(1), rgbcolor=(Integer(1),Integer(1),Integer(0)), fill=True)
Graphics object consisting of 1 graphics primitive

Il est aussi possible de créer un cercle en l’affectant à une variable ; ceci ne provoque pas son affichage.

sage: c = circle((0,0), 1, rgbcolor=(1,1,0))
>>> from sage.all import *
>>> c = circle((Integer(0),Integer(0)), Integer(1), rgbcolor=(Integer(1),Integer(1),Integer(0)))

Pour l’afficher, on utilise c.show() ou show(c), comme suit :

sage: c.show()
>>> from sage.all import *
>>> c.show()

Alternativement, l’évaluation de c.save('filename.png') enregistre le graphique dans le fichier spécifié.

Toutefois, ces « cercles » ressemblent plus à des ellipses qu’à des cercles, puisque les axes possèdent des échelles différentes. On peut arranger ceci :

sage: c.show(aspect_ratio=1)
>>> from sage.all import *
>>> c.show(aspect_ratio=Integer(1))

La commande show(c, aspect_ratio=1) produit le même résultat. On peut enregistrer l’image avec cette option par la commande c.save('filename.png', aspect_ratio=1).

Il est très facile de tracer le graphique de fonctions de base :

sage: plot(cos, (-5,5))
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> plot(cos, (-Integer(5),Integer(5)))
Graphics object consisting of 1 graphics primitive

En spécifiant un nom de variable, on peut aussi créer des graphes paramétriques :

sage: x = var('x')
sage: parametric_plot((cos(x),sin(x)^3),(x,0,2*pi),rgbcolor=hue(0.6))
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> x = var('x')
>>> parametric_plot((cos(x),sin(x)**Integer(3)),(x,Integer(0),Integer(2)*pi),rgbcolor=hue(RealNumber('0.6')))
Graphics object consisting of 1 graphics primitive

Différents graphiques peuvent se combiner sur une même image :

sage: x = var('x')
sage: p1 = parametric_plot((cos(x),sin(x)),(x,0,2*pi),rgbcolor=hue(0.2))
sage: p2 = parametric_plot((cos(x),sin(x)^2),(x,0,2*pi),rgbcolor=hue(0.4))
sage: p3 = parametric_plot((cos(x),sin(x)^3),(x,0,2*pi),rgbcolor=hue(0.6))
sage: show(p1+p2+p3, axes=false)
>>> from sage.all import *
>>> x = var('x')
>>> p1 = parametric_plot((cos(x),sin(x)),(x,Integer(0),Integer(2)*pi),rgbcolor=hue(RealNumber('0.2')))
>>> p2 = parametric_plot((cos(x),sin(x)**Integer(2)),(x,Integer(0),Integer(2)*pi),rgbcolor=hue(RealNumber('0.4')))
>>> p3 = parametric_plot((cos(x),sin(x)**Integer(3)),(x,Integer(0),Integer(2)*pi),rgbcolor=hue(RealNumber('0.6')))
>>> show(p1+p2+p3, axes=false)

Une manière commode de tracer des formes pleines est de préparer une liste de points (L dans l’exemple ci-dessous) puis d’utiliser la commande polygon pour tracer la forme pleine dont le bord est formé par ces points. Par example, voici un deltoïde vert :

sage: L = [[-1+cos(pi*i/100)*(1+cos(pi*i/100)),
....:     2*sin(pi*i/100)*(1-cos(pi*i/100))] for i in range(200)]
sage: polygon(L, rgbcolor=(1/8,3/4,1/2))
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> L = [[-Integer(1)+cos(pi*i/Integer(100))*(Integer(1)+cos(pi*i/Integer(100))),
...     Integer(2)*sin(pi*i/Integer(100))*(Integer(1)-cos(pi*i/Integer(100)))] for i in range(Integer(200))]
>>> polygon(L, rgbcolor=(Integer(1)/Integer(8),Integer(3)/Integer(4),Integer(1)/Integer(2)))
Graphics object consisting of 1 graphics primitive

Pour visualiser le graphique en masquant les axes, tapez show(p, axes=false).

On peut ajouter un texte à un graphique :

sage: L = [[6*cos(pi*i/100)+5*cos((6/2)*pi*i/100),
....:     6*sin(pi*i/100)-5*sin((6/2)*pi*i/100)] for i in range(200)]
sage: p = polygon(L, rgbcolor=(1/8,1/4,1/2))
sage: t = text("hypotrochoid", (5,4), rgbcolor=(1,0,0))
sage: show(p+t)
>>> from sage.all import *
>>> L = [[Integer(6)*cos(pi*i/Integer(100))+Integer(5)*cos((Integer(6)/Integer(2))*pi*i/Integer(100)),
...     Integer(6)*sin(pi*i/Integer(100))-Integer(5)*sin((Integer(6)/Integer(2))*pi*i/Integer(100))] for i in range(Integer(200))]
>>> p = polygon(L, rgbcolor=(Integer(1)/Integer(8),Integer(1)/Integer(4),Integer(1)/Integer(2)))
>>> t = text("hypotrochoid", (Integer(5),Integer(4)), rgbcolor=(Integer(1),Integer(0),Integer(0)))
>>> show(p+t)

En cours d’analyse, les professeurs font souvent le dessin suivant au tableau : non pas une mais plusieurs branches de la fonction arcsin, autrement dit, le graphe d’équation \(y=\sin(x)\) pour \(x\) entre \(-2\pi\) et \(2\pi\), renversé par symétrie par rapport à la première bissectrice des axes. La commande Sage suivante réalise cela :

sage: v = [(sin(x),x) for x in srange(-2*float(pi),2*float(pi),0.1)]
sage: line(v)
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> v = [(sin(x),x) for x in srange(-Integer(2)*float(pi),Integer(2)*float(pi),RealNumber('0.1'))]
>>> line(v)
Graphics object consisting of 1 graphics primitive

Comme les valeurs prises par la fonction tangente ne sont pas bornées, pour utiliser la même astuce pour représenter la fonction arctangente, il faut préciser les bornes de la coordonnée x :

sage: v = [(tan(x),x) for x in srange(-2*float(pi),2*float(pi),0.01)]
sage: show(line(v), xmin=-20, xmax=20)
>>> from sage.all import *
>>> v = [(tan(x),x) for x in srange(-Integer(2)*float(pi),Integer(2)*float(pi),RealNumber('0.01'))]
>>> show(line(v), xmin=-Integer(20), xmax=Integer(20))

Sage sait aussi tracer des graphiques en coordonnées polaires, des lignes de niveau et (pour certains types de fonctions) des champs de vecteurs. Voici un exemple de lignes de niveau :

sage: f = lambda x,y: cos(x*y)
sage: contour_plot(f, (-4, 4), (-4, 4))
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> f = lambda x,y: cos(x*y)
>>> contour_plot(f, (-Integer(4), Integer(4)), (-Integer(4), Integer(4)))
Graphics object consisting of 1 graphics primitive

Graphiques en trois dimensions#

Sage produit des graphes en trois dimensions en utilisant le package open source appelé [ThreeJS]. En voici quelques exemples :

Le parapluie de Whitney tracé en jaune http://en.wikipedia.org/wiki/Whitney_umbrella:

sage: u, v = var('u,v')
sage: fx = u*v
sage: fy = u
sage: fz = v^2
sage: parametric_plot3d([fx, fy, fz], (u, -1, 1), (v, -1, 1),
....:   frame=False, color="yellow")
Graphics3d Object
>>> from sage.all import *
>>> u, v = var('u,v')
>>> fx = u*v
>>> fy = u
>>> fz = v**Integer(2)
>>> parametric_plot3d([fx, fy, fz], (u, -Integer(1), Integer(1)), (v, -Integer(1), Integer(1)),
...   frame=False, color="yellow")
Graphics3d Object

Une fois évaluée la commande parametric_plot3d, qui affiche le graphique, il est possible de cliquer et de le tirer pour faire pivoter la figure.

Le bonnet croisé (cf. http://en.wikipedia.org/wiki/Cross-cap ou http://www.mathcurve.com/surfaces/bonnetcroise/bonnetcroise.shtml) :

sage: u, v = var('u,v')
sage: fx = (1+cos(v))*cos(u)
sage: fy = (1+cos(v))*sin(u)
sage: fz = -tanh((2/3)*(u-pi))*sin(v)
sage: parametric_plot3d([fx, fy, fz], (u, 0, 2*pi), (v, 0, 2*pi),
....:   frame=False, color="red")
Graphics3d Object
>>> from sage.all import *
>>> u, v = var('u,v')
>>> fx = (Integer(1)+cos(v))*cos(u)
>>> fy = (Integer(1)+cos(v))*sin(u)
>>> fz = -tanh((Integer(2)/Integer(3))*(u-pi))*sin(v)
>>> parametric_plot3d([fx, fy, fz], (u, Integer(0), Integer(2)*pi), (v, Integer(0), Integer(2)*pi),
...   frame=False, color="red")
Graphics3d Object

Un tore tordu :

sage: u, v = var('u,v')
sage: fx = (3+sin(v)+cos(u))*cos(2*v)
sage: fy = (3+sin(v)+cos(u))*sin(2*v)
sage: fz = sin(u)+2*cos(v)
sage: parametric_plot3d([fx, fy, fz], (u, 0, 2*pi), (v, 0, 2*pi),
....:   frame=False, color="red")
Graphics3d Object
>>> from sage.all import *
>>> u, v = var('u,v')
>>> fx = (Integer(3)+sin(v)+cos(u))*cos(Integer(2)*v)
>>> fy = (Integer(3)+sin(v)+cos(u))*sin(Integer(2)*v)
>>> fz = sin(u)+Integer(2)*cos(v)
>>> parametric_plot3d([fx, fy, fz], (u, Integer(0), Integer(2)*pi), (v, Integer(0), Integer(2)*pi),
...   frame=False, color="red")
Graphics3d Object