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 20 and 250.
plt.show()
at the end to show the plot. Which version and which backend are you using?
plt.ylim((25,250))
and plt.ylim(ymax = 250, ymin = 25)
. I am using the Agg
backend.
axisbg
is now deprecated
plt.ylim
is the correct, modern solution to this problem. Here is a good resource: showmecode.info/matplotlib/axes/set-limits
Get current axis via plt.gca()
, and then set its limits:
ax = plt.gca()
ax.set_xlim([xmin, xmax])
ax.set_ylim([ymin, ymax])
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))
x1
and x2
, you can have matplotlib infer these with None
.
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)
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])
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
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.
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.
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.
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!
plt.savefig()
?
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?
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.
Success story sharing
None
which leaves the calculation to matplotlib, e.g.axes.set_ylim([ymin,None])
None
as in @linqu 's post:set_ylim(bottom=None, top=None, [...], *, ymin=None, ymax=None)
.bottom
andymin
(equivalent) for minimum.top
andymax
) equivalent for maximum. You can't use bothbottom
andymin
at once. Same withtop
andymax
.