Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I'm working on several pieces of coursework involving lots of plots generated with matplotlib in python scripts.

Currently I'm doing this with an iterative process where I set a plot size in the latex code, generate the correctly sized plot in my python script and run latex to generate the document. This is then repeated when it inevitably doesn't quite look how I want it.

This is quite time consuming so I've been looking for some way of speeding things up. What would be ideal would be to run my python script once to produce the graph and then import it in latex using some command to scale it appropriately while keeping the font settings consistent with the rest of the document. I'd then play with the settings within latex without needing to modify and re-run the python script each time.

The first and second answers to this question seem to be what I'm looking for, but unfortunately they are for Matlab.

I've tried using the same procedure with the matplotlib equivalent commands but have had the following problems:

1. Generating pgf with matplotlib, scaling with tikzscale:

I generate a pgf plot from matplotlib called test.pgf and use the following latex code:

\documentclass{article}
\usepackage{pgf}
\usepackage{tikz}
\usepackage{tikzscale}
\usepackage{pgfplots}

\begin{document}
    \begin{figure}
        \centering
        \includegraphics[width=0.5\textwidth]{test.pgf}
        \caption{Some figure}
        \label{fig:figure}
    \end{figure}
\end{document}

Fails with the following error:

! Package tikzscale Error: Requested to scale unscalable graphic.

2. Generating .svg with matplotlib, converting to .pdf, scaling with \includegraphics:

As before except just include test.pdf.

Fails as text in plots is not scaled correctly...

I'd of course be happy to look into some other method too if you can suggest anything!

share|improve this question
    
When you speak of the fonts, are we speaking of lots of text, such as axis labels and numbering, or are you speaking of sparse notations applied to an image? –  Steven B. Segletes Mar 12 at 10:24
    
I mean any text that would go in the plot - axis labels, tick labels, titles, legend text etc. –  randomperson1 Mar 12 at 13:22

1 Answer 1

up vote 4 down vote accepted

The matplotlib PGF backend saves as raw PGF. What you probably want instead is pgfplots, which you can get using matplotlib2tikz, assuming your plots aren't too complex and all the features are supported.

Sample Python script for creating figure:

from pylab import *
from matplotlib2tikz import save as tikz_save
x = linspace(0, 10, 101)
plot(x, sin(x))
xlabel('$x$-axis')
ylabel('$y$-axis')
tikz_save('fig.tikz',
           figureheight = '\\figureheight',
           figurewidth = '\\figurewidth')

Sample accompanying LaTeX document that brings in the plots with two different dimensions (you could use \input; I'm using \InputIfFileExists so that missing figures won't kill compilation):

\documentclass{article}

\usepackage{pgfplots}

\newlength\figureheight
\newlength\figurewidth

\begin{document}

\setlength\figureheight{2in}
\setlength\figurewidth{3in}
\InputIfFileExists{fig.tikz}{}{\textbf{!! Missing graphics !!}}

\setlength\figureheight{3in}
\setlength\figurewidth{4in}
\InputIfFileExists{fig.tikz}{}{\textbf{!! Missing graphics !!}}

\end{document}

Output:

enter image description here

Depending on what you are doing, you could also consider using my PythonTeX package to put everything in the LaTeX source:

\documentclass{article}

\usepackage{pgfplots}
\usepackage[stdout=false]{pythontex}
% matplotlib2tikz prints messages to stdout, so don't include
% stdout automatically; could also redirect stdout to avoid this
\setpythontexworkingdir{.}
% set PythonTeX to use the document root directory as the working
% directory, so that all plots will be saved there; could use 
% another location, but then would need to specify a path when
% using \input and \InputIfFileExists

\newlength\figureheight
\newlength\figurewidth

\begin{document}

\begin{pycode}
from pylab import *
from matplotlib2tikz import save as tikz_save
x = linspace(0, 10, 101)
plot(x, sin(x))
xlabel('$x$-axis')
ylabel('$y$-axis')
tikz_save('fig.tikz',
       figureheight = '\\figureheight',
       figurewidth = '\\figurewidth')
\end{pycode}

\setlength\figureheight{2in}
\setlength\figurewidth{3in}
\InputIfFileExists{fig.tikz}{}{\textbf{!! Missing graphics !!}}

\setlength\figureheight{3in}
\setlength\figurewidth{4in}
\InputIfFileExists{fig.tikz}{}{\textbf{!! Missing graphics !!}}

\end{document}
share|improve this answer
    
Thanks for the help, this works nicely. As you say though it only seems to work for relatively simple plots. –  randomperson1 Mar 15 at 17:52

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.