I want to plot a graph with a lot of ticks on the X axis using the following code:
import pylab N = 100 data = pylab.np.linspace(0, N, N) pylab.plot(data) pylab.xticks(range(N)) # add loads of ticks pylab.grid() pylab.tight_layout() pylab.show() pylab.close()
The resulting plot looks like this:
As you can see, the X axis is a mess because the tick labels are plotted with too few space between them or even overlap.
I would like to create constant space between each tick label automatically, no matter how many ticks there are. So, I'd like to increase the space between individual ticks, thus potentially increasing the 'length' of a plot.
Note that the tick labels may be strings of variable length.
What I have found so far is all about spacing between the axis and labels (which is not what I want), tick frequency (which I can already do) and tick parameters (which don't seem to have any options for spacing).
I can change the size of a figure manually with matplotlib.pyplot.figure(figsize=(a, b))
, but that would require knowledge of the default spacing between ticks (there's none, as far as I can tell) and the greatest width (in inches) of a tick label, which I have no clue how to measure, so this is not an option, to my mind.
What can I do to increase spacing between ticks? I'm OK with getting a pretty lengthy image.
We can use the plt. subplots_adjust() method to change the space between Matplotlib subplots. The parameters wspace and hspace specify the space reserved between Matplotlib subplots. They are the fractions of axis width and height, respectively.
Setting Figure-Level Tick Frequency in Matplotlib You can use the xticks() and yticks() functions and pass in an array denoting the actual ticks. On the X-axis, this array starts on 0 and ends at the length of the x array. On the Y-axis, it starts at 0 and ends at the max value of y .
The spacing between ticklabels is exclusively determined by the space between ticks on the axes. Therefore the only way to obtain more space between given ticklabels is to make the axes larger.
In order to determine the space needed for the labels not to overlap, one may find out the largest label and multiply its length by the number of ticklabels. One may then adapt the margin around the axes and set the calculated size as a new figure size.
import numpy as np import matplotlib.pyplot as plt N = 150 data = np.linspace(0, N, N) plt.plot(data) plt.xticks(range(N)) # add loads of ticks plt.grid() plt.gca().margins(x=0) plt.gcf().canvas.draw() tl = plt.gca().get_xticklabels() maxsize = max([t.get_window_extent().width for t in tl]) m = 0.2 # inch margin s = maxsize/plt.gcf().dpi*N+2*m margin = m/plt.gcf().get_size_inches()[0] plt.gcf().subplots_adjust(left=margin, right=1.-margin) plt.gcf().set_size_inches(s, plt.gcf().get_size_inches()[1]) plt.savefig(__file__+".png") plt.show()
Note that if the figure shown in the plotting window is larger than the screen, it will be shrunk again, so the resized figure is only shown in its new size when saved. Or, one may choose to incorporate it in some window with scrollbars as shown in this question: Scrollbar on Matplotlib showing page
You could use the following to rotate the labels and make the font smaller:
ax.set_xticklabels(rotation = (45), fontsize = 10, va='bottom', ha='left')
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