Elgin Cahangirov
Elgin Cahangirov

Reputation: 2022

Matplotlib margins

Look at the chart below. In this chart, I want to draw to circle with the centre coordinates at (45, 0). But, as you see, bottom limit of chart is zero and half of my circle is not shown. So, I need to extend this chart to the bottom a little bit. "Margins" method of axes (ax.margins()) doesn't work, since bottom line of this chart is zero and zero multiplied by any number is equal to zero.

Note: Please, do not post replies like ax.set_ylim(...) or ax.set_yticks(...). I am looking for a general solution for this like problems.

Code
import matplotlib.pyplot as plt
import numpy as np

values = np.array([0.00388632352941, 0.00375827941176, 0.00355033823529,     0.00328273529412, 0.00294677941176, 0.00272142647059, 0.00246463235294,     0.00227766176471, 0.00213151470588, 0.00202594117647, 0.00183544117647,     0.00162102941177, 0.00148372058824, 0.00128380882353, 0.00112252941176,     0.000931544117647, 0.000786573529412, 0.000658220588235, 0.000584485294118,     0.000524044117647, 0.000562485294118, 0.000716441176471, 0.000872617647059,     0.00109039705882, 0.00124138235294, 0.00136894117647, 0.00143985294118,     0.00134760294118, 0.00121794117647, 0.00112772058824, 0.00109435294118,     0.00102432352941, 0.00101069117647, 0.00102417647059, 0.00104895588235,     0.00101776470588, 0.00101494117647, 0.000885558823529, 0.00078075,     0.000752647058824, 0.000667691176471, 0.000593220588236, 0.000658647058823,     0.000742117647059, 0.000651470588235, 0.000604647058824, 0.000584573529412,     0.00049530882353, 0.000281235294118, 0.000355029411765])
fig, ax = plt.subplots()
ax.bar(np.arange(values.shape[0]), values)
plt.show()

enter image description here

Upvotes: 1

Views: 2743

Answers (1)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339240

In the question there is no circle, so my answer doesn't include any circle either.

In order to have some space around the data in the plot, you can use ax.margins(y=ymargin), where ymargin is the percentage of space to add on each side of the data. I.e. if data goes from 0 to 1 and you add ymargin = 0.1 of margin, the ylimits will be (-0.1, 1.1). (This is independent on whether or not one limit would be zero or not.)

Now, by default this does not work for a bar plot, as it would in the general case be undesireable to have the bars start somewhere in the air, as opposed to the bottom axis. This behaviour is steered using a flag called use_sticky_edges. We can set this flag to False to get back the behaviour of margins being applied to both ends of the axis. For taking effect, we need to call ax.autoscale_view afterwards.

import matplotlib.pyplot as plt
import numpy as np

values = np.array([3.89, 3.76, 3.55, 3.28, 2.95, 2.72, 2.46, 2.28, 2.13, 2.03, 1.84, 
                   1.62, 1.48, 1.28, 1.12, 0.93, 0.79, 0.66, 0.58, 0.52, 0.56, 0.72, 
                   0.87, 1.09, 1.24, 1.37, 1.44, 1.35, 1.22, 1.13, 1.09, 1.02, 1.01, 
                   1.02, 1.05, 1.02, 1.01, 0.89, 0.78, 0.75, 0.67, 0.59, 0.66, 0.74, 
                   0.65, 0.60, 0.58, 0.50, 0.28, 0.36])

fig, ax = plt.subplots()
ax.bar(np.arange(values.shape[0]), values)

ax.margins(y=0.3)
ax.use_sticky_edges = False
ax.autoscale_view(scaley=True)
plt.show()

enter image description here

Upvotes: 3

Related Questions