Search code examples
pythonmatplotliblatexpgf

Getting semi-transparent text with matplotlib+pgf backend when compiling in LateX


So I am using the pgf backendin matplotlib to include some automatically compiled references to some other parts of my Tex documents (figures, bibliography) in my TeX document.

import matplotlib
matplotlib.use('pgf')

import matplotlib.pyplot as plt
plt.figure()
plt.txt(0.0,0.5,r'Some text compiled in latex \cite{my_bib_tag}')
plt.savefig("myfig.pgf", bbox_inches="tight", pad_inches=0)

Then in my tex document I have the lines:

\usepackage[dvipsnames]{xcolor}
%yada yada yada 
\begin{figure}
\input{myfig.pgf}
\end{figure}

It is working great but when I try to add some transparency to the text it doesn't work. For instance when setting:

plt.txt(0.0,0.5,r'Some text compiled in latex \cite{my_bib_tag}', alpha=0.5)

The text appears unchanged, and if I try to do it in the compilation by using \textcolorfrom the xcolor package (or any other commands in LateX, like the transparent package) I get parsing errors when compiling the Python.

I tried escaping characters but somehow I cannot make it work.

plt.txt(0.0,0.5,r'\textcolor{gray}{Some text compiled in latex \cite{my_bib_tag}}', alpha=0.5)
#raise ValueError !Undefined Control Sequence

EDIT 1: I tried adding the required package in the preamble, but it does not work when saving to pgf (with the pgf backend), it works using the Agg backend (I think it is expected behavior). But I need to save it in pgf to have the dynamic parsing of references.

import matplotlib

import matplotlib.pyplot as plt
matplotlib.rcParams["text.usetex"] = True
matplotlib.rcParams["text.latex.preamble"].append(r'\usepackage[dvipsnames]{xcolor}')
matplotlib.verbose.level = 'debug-annoying'

plt.figure()
plt.text(0.0,0.5,r'\textcolor{gray}{Some text compiled in latex \cite{my_bib_tag}}', alpha=0.5)
#works in .png, does not work in .pgf
#plt.savefig("myfig.png", bbox_inches="tight", pad_inches=0)

EDIT 2: A work around is to use the color param in plt.text but what if I would like to use more complicated LateX styling...


Solution

  • Thanks to @ImportanceOfBeingErnest I finally made it work with the pgf backend:

    import matplotlib
    matplotlib.use('pgf')
    
    import matplotlib.pyplot as plt
    
    pgf_with_custom_preamble = {
        "text.usetex": True,    # use inline math for ticks
        "pgf.rcfonts": False,   # don't setup fonts from rc parameters
        "pgf.preamble": [
                         "\\usepackage[dvipsnames]{xcolor}",         # load additional packages
                         ]
    }
    matplotlib.rcParams.update(pgf_with_custom_preamble)
    
    plt.figure()
    plt.text(0.0,0.5,r'\textcolor{gray}{Some text compiled in latex \cite{my_biblio_tag}}')
    plt.savefig("myfig.pgf", bbox_inches="tight", pad_inches=0)