718

I need help with setting the limits of y-axis on matplotlib. Here is the code that I tried, unsuccessfully.

import matplotlib.pyplot as plt

plt.figure(1, figsize = (8.5,11))
plt.suptitle('plot title')
ax = []
aPlot = plt.subplot(321, axisbg = 'w', title = "Year 1")
ax.append(aPlot)
plt.plot(paramValues,plotDataPrice[0], color = '#340B8C', 
     marker = 'o', ms = 5, mfc = '#EB1717')
plt.xticks(paramValues)
plt.ylabel('Average Price')
plt.xlabel('Mark-up')
plt.grid(True)
plt.ylim((25,250))

With the data I have for this plot, I get y-axis limits of 20 and 200. However, I want the limits to be 20 and 250.

10 Answers 10

1008

Get current axis via plt.gca(), and then set its limits:

ax = plt.gca()
ax.set_xlim([xmin, xmax])
ax.set_ylim([ymin, ymax])
3
  • 391
    BTW, this is a silly abbreviation means "get the current axes".
    – Lenar Hoyt
    Commented May 8, 2017 at 10:57
  • 104
    you can also set one value None which leaves the calculation to matplotlib, e.g. axes.set_ylim([ymin,None])
    – linqu
    Commented Sep 13, 2018 at 10:14
  • 4
    There are other options instead of using None as in @linqu 's post: set_ylim(bottom=None, top=None, [...], *, ymin=None, ymax=None). bottom and ymin (equivalent) for minimum. top and ymax) equivalent for maximum. You can't use both bottom and ymin at once. Same with top and ymax.
    – MaciekS
    Commented Nov 4, 2021 at 8:24
199

One thing you can do is to set your axis range by yourself by using matplotlib.pyplot.axis.

matplotlib.pyplot.axis

from matplotlib import pyplot as plt
plt.axis([0, 10, 0, 20])

0,10 is for x axis range. 0,20 is for y axis range.

or you can also use matplotlib.pyplot.xlim or matplotlib.pyplot.ylim

matplotlib.pyplot.ylim

plt.ylim(-2, 2)
plt.xlim(0,10)
1
  • 6
    You can also fix only one of axis like: plt.ylim(-2, None), plt.xlim(None, 10)
    – xmantas
    Commented Feb 18, 2023 at 15:41
155

Another workaround is to get the plot's axes and reassign changing only the y-values:

x1,x2,y1,y2 = plt.axis()  
plt.axis((x1,x2,25,250))
1
  • 5
    You don't need to grab x1 and x2, you can have matplotlib infer these with None.
    – iacob
    Commented Mar 24, 2021 at 20:35
46

You can instantiate an object from matplotlib.pyplot.axes and call the set_ylim() on it. It would be something like this:

import matplotlib.pyplot as plt
axes = plt.axes()
axes.set_ylim([0, 1])
46

Just for fine tuning. If you want to set only one of the boundaries of the axis and let the other boundary unchanged, you can choose one or more of the following statements

plt.xlim(right=xmax) #xmax is your value
plt.xlim(left=xmin) #xmin is your value
plt.ylim(top=ymax) #ymax is your value
plt.ylim(bottom=ymin) #ymin is your value

Take a look at the documentation for xlim and for ylim

30

This worked at least in matplotlib version 2.2.2:

plt.axis([None, None, 0, 100])

Probably this is a nice way to set up for example xmin and ymax only, etc.

18

To add to @Hima's answer, if you want to modify a current x or y limit you could use the following.

import numpy as np # you probably alredy do this so no extra overhead
fig, axes = plt.subplot()
axes.plot(data[:,0], data[:,1])
xlim = axes.get_xlim()
# example of how to zoomout by a factor of 0.1
factor = 0.1 
new_xlim = (xlim[0] + xlim[1])/2 + np.array((-0.5, 0.5)) * (xlim[1] - xlim[0]) * (1 + factor) 
axes.set_xlim(new_xlim)

I find this particularly useful when I want to zoom out or zoom in just a little from the default plot settings.

12

This should work. Your code works for me, like for Tamás and Manoj Govindan. It looks like you could try to update Matplotlib. If you can't update Matplotlib (for instance if you have insufficient administrative rights), maybe using a different backend with matplotlib.use() could help.

4
  • Thanks for checking! I am using the pdf backend (matplotlib.use('PDF')). I am using the version that comes with latest version of the Enthought Python Distribution. Can you please see if it works with the PDF backend. Thanks! Commented Sep 23, 2010 at 12:25
  • It does work with the PDF backend, on Mac OS X. Are you sure that the output file is indeed updated with plt.savefig()? Commented Sep 23, 2010 at 13:43
  • I realized the problem, I think. If I take out aPlot = in the plt.subplot line it works for me too. It seems that if one assigns the subplot to a variable like that, some other method of setting the axes limits must be used. Is that true? Commented Sep 23, 2010 at 13:47
  • 2
    As far as I know, plt.ylim() applies the limits to the current axes, which are set when you do plt.subplot(). I also can't believe that plt.subplot() care about how the axes it returns are used (put into a variable or not, etc.). So I'd say it should work; it does work on my machine. Commented Sep 23, 2010 at 16:39
4

We can use plt.xlim() and plt.ylim() .

Check out the code below to understand it properly.

x = np.array([1,2,5,4,8])
fig = plt.figure(figsize=(5,5))

plt.plot(x,x**2, label='Square', marker='*')
plt.plot(x,x**3, label='Cube', marker='o')
plt.xlim(1,20)
plt.ylim(1,600)
plt.legend()
plt.show()

Output is shown in the photo below.

Output

1
3

ylim can be set using Axes.set(). In fact a whole host of properties can be set via set(), such as ticks, ticklabels, labels, title etc. (that were set separately in the OP).

ax = plt.gca()
ax.set(ylim=(20, 250), xlim=(0, 100))

Then again, ylim (and other properties) can be set in the plt.subplot instance as well. For the case in the OP, that would be

aPlot = plt.subplot(321, facecolor='w', title="Year 1", ylim=(20,250), xticks=paramValues, ylabel='Average Price', xlabel='Mark-up')
#                                                       ^^^^  <---- ylim here
plt.plot(paramValues, plotDataPrice[0], color='#340B8C', marker='o', ms=5, mfc='#EB1717');

To set ylim (and other properties) for multiple subplots, use plt.setp. For example, if we include 2 more subplots to OP's code and if we want to set the same properties to all of them, one way to do it would be as follows:

import matplotlib.pyplot as plt
import random

plt.figure(1, figsize = (8.5,11))
plt.suptitle('plot title')
ax = []
paramValues = range(10)
for i in range(1, 4):
    aPlot = plt.subplot(3,2,i, title=f"Year {i}")
    ax.append(aPlot)
    aPlot.plot(paramValues, [random.randint(20,200) for _ in paramValues], color='#340B8C', marker='o', ms=5, mfc='#EB1717')
    aPlot.grid(True);

plt.setp(ax, ylim=(20,250), facecolor='w', xticks=paramValues, ylabel='Average Price', xlabel='Mark-up')
#            ^^^^  <---- ylim here
plt.tight_layout();

Not the answer you're looking for? Browse other questions tagged or ask your own question.