I am trying to recreate the look of figure below using matplotlib (source).
However, I am having issues with the placement of the ylabel
. I want it at the top of the y
-axis, as it is on the figure. I have tried setting its position with ax.yaxis.set_label_position()
, but this only accepts left
or right
for the y-axis. Is there an option to control the position of the ylabel
, or should I just use ax.text
and set the text's position manually?
EDIT: As it turns out, the ax.set_ylabel(position=(x,y))
sets the position of the label relative to the graph coordinates. However, because of its horizontal rotation, the label is a little too much to the right, and position(x,y)
does not seem to accept negative inputs. Is there a way to move the label a little to the left?
I include the code used to generate the skeleton of the figure here, even though it's rather messy.
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams['text.usetex'] = True
mpl.rcParams['text.latex.preamble'] = [r"\usepackage[charter]{mathdesign}"]
mpl.rcParams['font.family'] = ['serif']
mpl.rcParams['font.size'] = 10
nb_procs = np.array([1, 2, 4, 12, 24, 48, 96, 192, 384])
def adjust_spines(ax, spines):
for loc, spine in ax.spines.items():
if loc in spines:
spine.set_position(('outward', 10)) # outward by 10 points
spine.set_smart_bounds(True)
else:
spine.set_color('none') # don't draw spine
# turn off ticks where there is no spine
if 'left' in spines:
ax.yaxis.set_ticks_position('left')
else:
# no yaxis ticks
ax.yaxis.set_ticks([])
if 'bottom' in spines:
ax.xaxis.set_ticks_position('bottom')
else:
# no xaxis ticks
ax.xaxis.set_ticks([])
# -- We create the figure.
figPres = plt.figure(figsize=(3,1.75))
axPres = figPres.add_subplot(111)
# -- We remove any superfluous decoration.
# Remove the axis decorations on the right and on the top.
axPres.spines['top'].set_visible(False)
axPres.spines['right'].set_visible(False)
# Make the remaining spines a light gray.
axPres.spines['bottom'].set_color('gray')
axPres.spines['left'].set_color('gray')
adjust_spines(axPres, ['left', 'bottom'])
# -- Set the x ticks.
axPres.set_xscale('log')
axPres.set_xlim((0.75,500))
axPres.set_xticks((nb_procs))
axPres.set_xticklabels( (r'1', r'2', r'4', r'12', r'24', r'48', r'96', r'192', r'384'), color='gray' )
axPres.xaxis.set_ticks_position('bottom')
for tic in axPres.xaxis.get_major_ticks():
tic.tick1On = tic.tick2On = False
# -- Set the y ticks.
axPres.set_ylim((0,1))
axPres.set_yticks((0.0,0.5,1.0))
axPres.set_yticklabels((r'0', '', r'1'))
axPres.yaxis.set_ticks_position('left')
axPres.tick_params(axis='y', colors='gray')
#for tac in axPres.yaxis.get_major_ticks():
# tac.tick1On = tac.tick2On = False
for toc in axPres.xaxis.get_minor_ticks():
toc.tick1On = toc.tick2On = False
# -- Set the titles of the axes.
axPres.set_ylabel(r"Efficacit\'e", color='gray', rotation='horizontal')
axPres.yaxis.set_label_position('right')
axPres.set_xlabel(r"Nombre de processeurs", color='gray')
plt.show()
When setting the xlabel, the x parameter assigns the position in axis units, so 0 is the origin and 1 is the right edge of the plot. y is ignored as it's expected to be a default value, just below the tick marks. To override this behavior, you can set the position in axis units using the Axis set_label_coords method.
With matplotlib version 3.3. 0, the matplotlib functions set_xlabel and set_ylabel have a new parameter “loc” that can help adjust the positions of axis labels. For the x-axis label, it supports the values 'left', 'center', or 'right' to place the label towards left/center/right.
Rotate Y-Axis Tick Labels in Matplotlibyticks() , or on the Axes-lebel by using tick. set_rotation() or by manipulating the ax.
You can move the ylabel using ax.yaxis.set_label_coords
, which does accept negative numbers. For your example, I removed the line with set_label_position
, and added:
axPres.yaxis.set_label_coords(-0.1,1.02)
It seems like the 3.5 version of matplotlib doesn't support the yaxis
any more. I have found a workaround that gives similar result
axPres.set_ylabel(r"Efficacit\'e", loc="top", rotation="horizontal")
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