I'm trying to make some publication-quality plots, but I have encountered a small problem. It seems by default that matplotlib axis labels and legend entries are weighted heavier than the axis tick marks. Is there anyway to force the axis labels/legend entries to be the same weight as the tick marks?
import matplotlib.pyplot as plt
import numpy as np
plt.rc('text',usetex=True)
font = {'family':'serif','size':16}
plt.rc('font',**font)
plt.rc('legend',**{'fontsize':14})
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
fig = plt.figure(figsize=(5,5))
p1, = plt.plot(x,y)
p2, = plt.plot(x,x**2)
plt.xlabel('x-Axis')
plt.ylabel('y-Axis')
plt.legend([p1,p2],['Sin(x)','x$^2$'])
plt.gcf().subplots_adjust(left=0.2)
plt.gcf().subplots_adjust(bottom=0.15)
plt.savefig('Test.eps',bbox_inches='tight',format='eps')
plt.show()
I can use math-mode, but the problem (annoyance) is when I have a sentence for a label, i.e.,
plt.xlabel('$\mathrm{This is the x-axis}$')
which squishes it all together. I can fix it by using
plt.xlabel('$\mathrm{This\: is\: the\: x-axis}$')
but that needs a lot of punctuation. I was hoping there was something that I could change that would allow me to bypass the \mathrm{}
format, and use standard TeX format.
The other option I tried, was using \text
instead of \mathrm
, but it seems that Python's interpreter doesn't recognize this without loading the package amsmath. I have also tried:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
plt.rc('text',usetex=True)
font = {'family':'serif','size':16}
plt.rc('font',**font)
plt.rc('legend',**{'fontsize':14})
matplotlib.rcParams['text.latex.preamble']=[r'\usepackage{amsmath}']
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
fig = plt.figure(figsize=(5,5))
p1, = plt.plot(x,y)
p2, = plt.plot(x,x**2)
plt.xlabel(r'$\text{this is the x-Axis}$')
plt.ylabel('$y-Axis$')
plt.legend([p1,p2],['Sin(x)','x$^2$'])
plt.gcf().subplots_adjust(left=0.2)
plt.gcf().subplots_adjust(bottom=0.15)
plt.savefig('Test.eps',bbox_inches='tight',format='eps')
plt.show()
This doesn't return the desired result either.
Matplotlib x-axis label remove We have to call the set_visible() method and set its value to False to remove the x-axis label. To set the x-axis and y-axis labels, we use the ax. set_xlabel() and ax.
MatPlotLib with Python To set the Matplotlib title in bold while using "Times New Roman", we can use fontweight="bold".
To change the position of a legend in Matplotlib, you can use the plt. legend() function. The default location is “best” – which is where Matplotlib automatically finds a location for the legend based on where it avoids covering any data points.
To make bold font weight LaTeX axes label in matplotlib, we can take the following steps− Create x and y data points using numpy. Using subplot () method, add a subplot to the current figure. Set x and y ticks with data points x and y using set_xticks and set_yticks methods, respectively.
The Axis.set_label () function in axis module of matplotlib library is used to set the label that will be displayed in the legend. Parameters: This method accepts the following parameters.
The size of data axis labels, commonly known as tick labels, can be changed. We only need to pass the fontsize parameter and set its value. To modify the size of an x tick label, use the following syntax: We import the matplotlib.pyplot package in the example above. Following that, we define the data that will be plotted.
If we want to change the font size of the axis labels, we can use the parameter “fontsize” and set it your desired number. Example 2: Changing the y-axis label. Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.
The other answer provides a work-around to the problem... However, the problem is very specific to matplotlib and the implementation of the LateX backend.
First of all, the rc
parameter controlling the font weight of the axis labels is 'axes.labelweight'
, which by default is set to u'normal'
. This means that the labels should already be in regular weight.
The reason why the font appears to be bold can be found in matplotlib/texmanager.py
:
The font family is chosen by 'font.family'
, in the case of the OP, this is serif
.
Then, the array 'font.<font.family>'
(here: font.serif
) is evaluated, and the declaration of all fonts is added to the LateX preamble. Among those declarations is the line
\renewcommand{\rmdefault}{pnc}
which sets the default to New Century School Book which appears to be a bold version of Computer Modern Roman.
In conclusion, the shortest way to solve the problem is to set font.serif
to contain only Computer Modern Roman:
font = {'family':'serif','size':16, 'serif': ['computer modern roman']}
This has the additional benefit that it works for all elements, even for labels and other captions - without dirty tricks using the math mode:
Here is the complete code to generate the plot:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
plt.rc('text',usetex=True)
#font = {'family':'serif','size':16}
font = {'family':'serif','size':16, 'serif': ['computer modern roman']}
plt.rc('font',**font)
plt.rc('legend',**{'fontsize':14})
matplotlib.rcParams['text.latex.preamble']=[r'\usepackage{amsmath}']
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
fig = plt.figure(figsize=(5,5))
p1, = plt.plot(x,y)
p2, = plt.plot(x,x**2)
plt.xlabel(r'$\text{this is the x-Axis}$')
plt.ylabel('$y-Axis$')
plt.legend([p1,p2],['Sin(x)','x$^2$'])
plt.gcf().subplots_adjust(left=0.2)
plt.gcf().subplots_adjust(bottom=0.15)
plt.savefig('Test.eps',bbox_inches='tight',format='eps')
plt.show()
How about:
import matplotlib.pyplot as plt
import numpy as np
plt.rc('text',usetex=True)
font = {'family':'serif','size':16}
plt.rc('font',**font)
plt.rc('legend',**{'fontsize':14})
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
fig = plt.figure(figsize=(5,5))
p1, = plt.plot(x,y)
p2, = plt.plot(x,x**2)
plt.xlabel('$\mathrm{This is the }x\mathrm{-axis}$'.replace(' ','\: '))
plt.ylabel('$y\mathrm{-axis}$')
plt.legend([p1,p2],['$\sin(x)$','$x^2$'], loc='best')
fig.subplots_adjust(left=0.2, bottom=0.15)
plt.savefig('Test.eps',bbox_inches='tight',format='eps')
plt.show()
This uses
plt.xlabel('$\mathrm{This is the }x\mathrm{-axis}$'.replace(' ','\: '))
to replace spaces with '\: '
. TeX gurus may object to this however. You may want to ask on TeX stackexchange if there is a better way.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With