Search code examples
pythonfontsmatplotlibtexrc

Upright mu in plot label: retaining original tick fonts


I have a problem which I thought would be more occurring. However, after scouring the internet for some time now I have not been able to find the solution to my problem. So here it goes:

For a plot, created using matplotlib.pyplot I want to incorporate the SI-unit micro meter into my xlabel. The unit micro meter however needs to be upright. After some fiddling around I achieved the desired xlabel.

The code that I have to generate this is:

import matplotlib
import matplotlib.pyplot as plt

matplotlib.rc('text', usetex = True)
params = {'text.latex.preamble': [r'\usepackage{siunitx}', r'\usepackage{cmbright}']}
plt.rcParams.update(params)


fig = plt.figure()
ax = fig.add_subplot(1,1,1)

ax.set_xlabel('$\si{\micro \meter}$', fontsize = 16)
ax.set_ylabel("hi", fontsize = 16)

plt.savefig("test.png")

The result is shown below: enter image description here The micro meter is exactly as I want it to be. The problem however is that the font of the x and y ticks is altered. This is because of:

matplotlib.rc('text', usetex = True)

How can I reset the font values to their original values? Or how can I make sure the fonts are not changed when introducing tex?

As a reference, the original values I am referring to look like this: enter image description here Besides trying to revert the fonts back to their original values I also tried different methods of incorporating micro meter into my xlabel. The problem that arises here is that I it remains italic or it has a bold type setting. The micro meter I am looking for is the one given in the first figure.

I hope someone can help me solve this problem.

Thanx in advance


Solution

  • I am also struggling with such a problem, i.e. getting the tick labels and axes labels to be consistent when text.usetex = True. The solution that I have managed to find it not ideal, but it works for the moment.

    What you have to do is set the font family to "sans-serif" and also add a latex package that uses sans-serif math fonts (sfmath -- make sure it is in your tex path!)

    import matplotlib
    import matplotlib.pyplot as plt
    
    matplotlib.rc('text', usetex = True)
    matplotlib.rc('font', **{'family':"sans-serif"})
    params = {'text.latex.preamble': [r'\usepackage{siunitx}', 
        r'\usepackage{sfmath}', r'\sisetup{detect-family = true}',
        r'\usepackage{amsmath}']}   
    plt.rcParams.update(params)   
    
    fig = plt.figure(figsize = (4,4))
    ax = fig.add_subplot(1,1,1)
    ax.set_xlabel('$\si{\um} detection$')
    ax.set_ylabel(r"$\mu \boldsymbol{\mu}$")
    plt.show()                              
    

    In addition, I had to tell the siunitx package to detect the font family, and I also had to add some additional text to the x-label in order for the detection to actually work (you can remove this text later and the label will still work after that).

    For me this results in: enter image description here More generally, I have the following my ~/.matplotlib/matploblibrc file, for serif fonts:

    font.family    : serif 
    text.latex.preamble    :   \usepackage{mathptmx}
    

    and for sans-serif:

    font.family : sans-serif 
    text.latex.preamble :   \usepackage{sfmath}