Enregistrer une image Sagemath

Bonjour, j'aimerais enregistrer une image en 3d produite par sagemath si possible en .svg ou .eps mais je n'y arrive pas, pourtant les manuels stipulent que c'est possible (en utilisant la commande save) et pouvoir en controler la taille. J'aimerais connaitre également à l'avance où va être enregistrée l'image, car en .png elle s'enregistre aléatoirement en fichier temporaire ou dans mes documents.

Je vous remercie d'avance :)

Réponses

  • Imagine que tu aies produit un objet G de type Graphics, par exemple "G=plot(sin)". Pour le sauver dans un répertoire fixé, il faut repérer le chemin absolu du répertoire, disons "/home/toto/Images/Sage", et invoquer :
    G.save('/home/toto/Images/Sage/ma_belle_image.svg', figsize=8)
    
    Tu peux mettre (en option) de "save" les options que tu mettrais pour "show" (par exemple, figsize, aspect_ratio, ymin, etc.).

    Si G est un graphique 3d, on peut assurément le sauver en png mais ça ne me semble pas clair qu'on puisse en faire du svg ou de l'eps directement, en tout cas je ne sais pas faire.
  • Merci, j'ai essayé mais ca ne marche toujours pas, il donne un message d'erreur. Voilà ce que je tape:
    u,v=var('u,v')
    C=parametric_plot3d([(5+1.5*cos(v)),0,1.5*sin(v)],(v,0,2*pi), color='red')
    T=parametric_plot3d([(5+1.5*cos(v))*cos(u),(5+1.5*cos(v))*sin(u),1.5*sin(v)],(u,0,2*pi),(v,0,2*pi),frame=False,opacity=0.4,color='grey',aspect_ratio=[1,1,1])
    G=C+T
    G.show
    G.save('C:\Users\Bastien\Documents\rapport tipe\tore.png',figsize=30)
    

    Mais voilà ce qu'il retourne:
    RuntimeError                              Traceback (most recent call last)
    <ipython-input-3-eb58d1d1c2c9> in <module>()
          4 G=C+T
          5 G.show
    ----> 6 G.save('C:\Users\Bastien\Documents\rapport tipe\tore.png',figsize=Integer(30))
    
    /opt/sagemath-8.5/local/lib/python2.7/site-packages/sage/plot/plot3d/base.pyx in sage.plot.plot3d.base.Graphics3d.save (build/cythonized/sage/plot/plot3d/base.c:20917)()
       1619         elif ext in ['.bmp', '.png', '.gif', '.ppm', '.tiff', '.tif',
       1620                      '.jpg', '.jpeg']:
    -> 1621             self.save_image(filename, **kwds)
       1622         elif filename.endswith('.spt.zip'):
       1623             scene = self._rich_repr_jmol(**kwds)
    
    /opt/sagemath-8.5/local/lib/python2.7/site-packages/sage/plot/plot3d/base.pyx in sage.plot.plot3d.base.Graphics3d.save_image (build/cythonized/sage/plot/plot3d/base.c:20475)()
       1548             raise ValueError('unknown image file type: {0}'.format(ext))
       1549         if ext == '.png':
    -> 1550             self._save_image_png(filename, **kwds)
       1551         else:
       1552             png = tmp_filename(ext='.png')
    
    /opt/sagemath-8.5/local/lib/python2.7/site-packages/sage/plot/plot3d/base.pyx in sage.plot.plot3d.base.Graphics3d._save_image_png (build/cythonized/sage/plot/plot3d/base.c:20112)()
       1510             render.png.save_as(filename)
       1511         elif viewer == 'jmol':
    -> 1512             scene = self._rich_repr_jmol(**opts)
       1513             scene.preview_png.save_as(filename)
       1514         else:
    
    /opt/sagemath-8.5/local/lib/python2.7/site-packages/sage/plot/plot3d/base.pyx in sage.plot.plot3d.base.Graphics3d._rich_repr_jmol (build/cythonized/sage/plot/plot3d/base.c:7338)()
        274 
        275             script = '''set defaultdirectory "{0}"\nscript SCRIPT\n'''.format(scene_native)
    --> 276             jdata.export_image(targetfile=preview_png, datafile=script,
        277                                image_type="PNG",
        278                                figsize=opts['figsize'][0])
    
    /opt/sagemath-8.5/local/lib/python2.7/site-packages/sage/interfaces/jmoldata.pyc in export_image(self, targetfile, datafile, datafile_cmd, image_type, figsize, **kwds)
        179                 stdout=jout, stderr=jout, env=env)
        180         if not os.path.isfile(targetfile):
    --> 181             raise RuntimeError("Jmol failed to create file %s, see %s for details"%(repr(targetfile), repr(scratchout)))
        182         os.unlink(scratchout)
    
    RuntimeError: Jmol failed to create file '/home/sage/.sage/temp/DESKTOP-KFC101C/5372/dir_TMw8C0/preview.png', see '/home/sage/.sage/temp/DESKTOP-KFC101C/5372/tmp_AoopDh.txt' for details
    
    Je sais pas pourquoi, pourtant je recopie les syntaxes données sur le net...
  • Il y a deux petites choses qui me surprennent :
    • la ligne "G.show" ne sert à rien, elle renvoie "<built-in method show of Graphics3dGroup object at 0x7fc8d01045f0>
      " ; pour ouvrir la fenêtre, il faudrait invoquer "G.show()" mais de toute façon, ça ne sert pas pour une sauvegarde directe ;
    • problème plus plausiible : l'espace dans le nom du répertoire "rapport tipe" ; pour éviter de tenter le diable, il vaudrait mieux renommer ce répertoire en "rapport_tipe" ou "rapportTipe" ou n'importe quoi mais sans espace (une autre chose à essayer serait de taper un \ avant l'espace mais comme principe, ce n'est pas une bonne idée de mettre des espaces dans le nom des fichiers ou des répertoires).
    Pas sûr que ça résolve ton problème mais c'est un premier essai.

    NB : À vrai dire, pour une figure dans l'espace, je trouve en général plus efficace de lancer jmol avec G.show(), de zoomer et faire tourner la figure et d'exporter à partir de là. Enfin, à part quand il s'agit de faire une animation.

    PS : Ci-joint ta figure sauvée par "G.save('/home/toto/Bureau/tore.png')".83672
  • Malheureusement ca ne règle pas le problème... Je pense que je vais faire une capture d'écran. Merci des conseils en tout cas!
  • Bon, désolé. Une dernière tentative ?
    G.save('/home/toto/Bureau/tore.png', viewer='tachyon')
    
    Sinon, on peut faire un peu mieux qu'une copie d'écran depuis Jmol : "Fichier -> Exporter -> Exporter une image..."
  • Je pense avoir compris: premièrement le chemin devait être un chemin dans le notebook et pas dans mon ordinateur, ensuite l'ordi ne tolère pas un figsize plus grand que 20 apparemment. Quant à tachyon, il ne prenait pas en charge la texture du tore.
    J'utilise le notebook jupyter pour afficher les images car dans la console de Sagemath, lorsqu'elle ouvre Jmol pour afficher l'image, il n'y a...qu'un fond noir. Qu'entends-tu par "Fichier"=>"Exporter=>exporter une image?
  • En travaillant depuis un terminal, Jmol lance une fenêtre au-dessus de laquelle il y a un menu "Fichier" etc. Depuis le notebook Jupyter, on s'attendrait à ce qu'un clic droit offre le même genre d'option. En pratique, je n'arrive pas à développer le sous-menu "File". Sic transit gloria mundi. En revanche, j'obtiens un message d'erreur comparable au tien avec une taille de figure de 30, ce que je n'avais pas anticipé. En revanche, j'arrive bien à enregistrer depuis Jupyter avec le chemin absolu – mais il pourrait y avoir une différence entre Windows et Linux de ce point de vue. Eh bien, désolé d'être si inutile !
  • Mais tu m'as bien aidé ! Moi non plus je ne peux dérouler le menu "file" sous jupyter.
    Hélas, je trouve que la documentation sur Sagemath est assez maigre et qu'il faut savoir bidouiller en informatique pour s'y retrouver.
Connectez-vous ou Inscrivez-vous pour répondre.