matplotlib : insérer un graphe dans un PDF

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je souhaiterais insérer un graphe généré avec matplotlib dans un fichier PDF (que je crée avec PyLaTeX). Je parviens à insérer une page, avec pdfpages et ce code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from pylatex import Document, Package
from pylatex.command import Command



if __name__ =="__main__":
    doc = Document('basic')

    pdfpages = doc.packages.append(Package('pdfpages'))
    plot = Command('includepdf', arguments='plot.pdf', options=['pages={1}'])

    doc.append('Some text.')
    doc.append(plot)
    doc.append('Some text 2.')

    doc.generate_pdf()

Rendu :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{pdfpages}


\begin{document}
Some text.
\includepdf[pages={1}]{plot.pdf}
Some text 2.
\end{document}

Mais j'obtiens ici trois pages. Or, je souhaiterais que le graphe prenne la place disponible, comme à la page 12 de ce PDF. Je pourrais générer une image puis l'insérer, mais sa taille ne s'adapterait pas au zoom sur le PDF.

Merci !

Édité par Vayel

+0 -0
Staff

Les pdf ne sont pas fais pour représenter une image et ce n'est pas étonant que ça se passe comme ça. Le problème là est surtout l'utilisation de includepdf dans le latex qui insere une page et non une image.

Donc deux solutions :

  • Soit tu utilise une autre fonction que includepdf dans latex pour insérer le document comme image. Mais j'y crois pas trop.
  • Soit tu génère une image depuis matplotlib. Pour ton histoire de zoom, là encore, deux solutions :

  • tu met un dpi assez élevé et du coup ça devrait être propre quelque soit le zoom

  • tu utilise un format d'image vectoriel. Chez moi matplotlib est capable de générer du SVG. Donc si tu peux l'insérer, ça fait exactement ce que tu veux.
+0 -0

Si tu as un PDF, tu peut l'inclure directement comme n'importe quelle autre image avec pdflatex, et préciser la largeur.

Un autre solution (qui est celle que j'utilise pour faire des graphes sur mes cours) est d'utiliser gnuplot avec le terminal cairolatex. De cette manière, c'est gnuplot qui génère du code LaTeX, puis TeX qui crée ton graphe. Lequel est donc au format PDF, directement zoom able et avec la même police que le reste du texte.

Mon Github — Tuto Homebrew — Article Julia

+0 -0
Auteur du sujet

Merci. ^^ La manière suivante, plutôt simple, convient :

1
2
3
4
5
6
7
import matplotlib.pyplot as plt

x = [0, 1, 2, 3, 4, 5, 6]
y = [15, 2, 7, 1, 5, 6, 9]

plt.plot(x, y)
plt.savefig("./plot.pdf")
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}


\begin{document}

Some text.

\begin{figure}[htbp]
  \centering
  \includegraphics[width=\textwidth]{plot}
  \caption{SVG sexy image}
\end{figure}

Some other text.

\end{document}

Édité par Vayel

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte