0

I am trying to implement a custimizing procedure of matplotlib plots for the use of a latex work. For more reference please take a look at the following link: LaTeXify Matplotlib

The goal is to change the font family to avant, so that it matches the fonts of the full report. A snapshot of the avant-font chosen can be found below:

enter image description here

The following piece of code shows what I have tried. I implemented the following code:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib

from math import sqrt
SPINE_COLOR = 'gray'

def latexify(fig_width=None, fig_height=None, columns=1):
    """Set up matplotlib's RC params for LaTeX plotting.
    Call this before plotting a figure.

    Parameters
    ----------
    fig_width : float, optional, inches
    fig_height : float,  optional, inches
    columns : {1, 2}
    """

    # code adapted from http://www.scipy.org/Cookbook/Matplotlib/LaTeX_Examples

    # Width and max height in inches for IEEE journals taken from
    # computer.org/cms/Computer.org/Journal%20templates/transactions_art_guide.pdf

    assert(columns in [1,2])

    if fig_width is None:
        fig_width = 3.39 if columns==1 else 6.9 # width in inches

    if fig_height is None:
        golden_mean = (sqrt(5)-1.0)/2.0    # Aesthetic ratio
        fig_height = fig_width*golden_mean # height in inches

    MAX_HEIGHT_INCHES = 8.0
    if fig_height > MAX_HEIGHT_INCHES:
        print("WARNING: fig_height too large:" + fig_height +
              "so will reduce to" + MAX_HEIGHT_INCHES + "inches.")
        fig_height = MAX_HEIGHT_INCHES

    params = {'backend': 'ps',
              'text.latex.preamble':[r'\usepackage{gensymb}', r'\usepackage{avant}'],
              'axes.labelsize': 8, # fontsize for x and y labels (was 10)
              'axes.titlesize': 8,
              'font.size': 8, # was 10
              'legend.fontsize': 8, # was 10
              'xtick.labelsize': 8,
              'ytick.labelsize': 8,
              'text.usetex': True,
              'figure.figsize': [fig_width,fig_height],
              'font.family': 'avant'
    }

    matplotlib.rcParams.update(params)

def format_axes(ax):

    for spine in ['top', 'right']:
        ax.spines[spine].set_visible(False)

    for spine in ['left', 'bottom']:
        ax.spines[spine].set_color(SPINE_COLOR)
        ax.spines[spine].set_linewidth(0.5)

    ax.xaxis.set_ticks_position('bottom')
    ax.yaxis.set_ticks_position('left')

    for axis in [ax.xaxis, ax.yaxis]:
        axis.set_tick_params(direction='out', color=SPINE_COLOR)

    return ax

df = pd.DataFrame(np.random.randn(10,2))
df.columns = ['Column 1', 'Column 2']



ax = df.plot()
ax.set_xlabel("X label")
ax.set_ylabel("Y label")
ax.set_title("Title")
plt.tight_layout()
plt.savefig("image1.pdf")


latexify()

ax = df.plot()
ax.set_xlabel("X label")
ax.set_ylabel("Y label")
ax.set_title("Title")
plt.tight_layout()
format_axes(ax)
plt.savefig("image2.pdf")

The problem is that it doesn't seem to recognize the avant font. This is the error I receive:

findfont: Font family ['avant'] not found. Falling back to DejaVu Sans.

Would somebody know how to adjust the code in order to obtain the desired font family (avant)?

Nadia Merquez
  • 53
  • 1
  • 1
  • 5

1 Answers1

0

You can ignore the findfont warning. It says that it cannot find a font avant on your system. However, since you are using latex for text rendering, the fact that matplotlib cannot find the font is irrelevant.

The important bit is to tell matplotlib to use the sans-serif font (because avant garde font only has a sans-serif font in it). Also for the ticklabels or other math mode, you need to tell it to use sans-serif as well.

from matplotlib import pyplot as plt

plt.rcParams.update({"text.usetex" : True,
                     'font.family' : 'sans-serif',
                     "text.latex.preamble" : r"\usepackage{avant} \usepackage{sansmath} \sansmath"})

x = ["Apples", "Bananas", "Cherry", "Dosenfrüchte"]
y = [400,500,300,100]

plt.bar(x,y, width=0.5, label="Fruits")
plt.legend()
plt.title("A juicy diagram")

plt.show()

enter image description here

For more generic information, check out Sans-serif math with latex in matplotlib

ImportanceOfBeingErnest
  • 321,279
  • 53
  • 665
  • 712