24

Here's an example of graphing large values.

import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [1000, 1002, 1001, 1003, 1005]
plt.bar(x,y) 
plt.show()

The y-axis starts at 0, so the bars all look equal. I know you can use plt.ylim to manually set the limits, but is there a way for matplotlib to automatically (and smartly) set the limits to reasonable values (like 998-1008), and also perhaps show an axis break?

2 Answers 2

33

A little bit of simple algebra will help fix the limits:

import matplotlib.pyplot as plt
import math
x = [1,2,3,4,5]
y = [1000, 1002, 1001, 1003, 1005]
low = min(y)
high = max(y)
plt.ylim([math.ceil(low-0.5*(high-low)), math.ceil(high+0.5*(high-low))])
plt.bar(x,y) 
plt.show()

In this way, you are able to find the difference between your y-values and use them to set the scale along the y-axis. I used math.ceil (as opposed to math.floor) in order to obtain the values you specified and ensure integers.

As far as an axis break goes, I'd suggest looking at this example.

Sign up to request clarification or add additional context in comments.

Comments

-1

A very simple way to "magnify" the top ends of the bars is to log-scale the y-axis.

plt.bar(x, y, log=True)

result1

The yticklabels get a scientific notation as a result but it's relatively simple to return to plain formatting by formatting both major and minor ticks.

import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter

x = [1,2,3,4,5]
y = [1000, 1002, 1001, 1003, 1005]

# log scale
plt.bar(x, y, log=True)
# remove scientific notation
plt.gca().yaxis.set(major_formatter=ScalarFormatter(), minor_formatter=ScalarFormatter());

result2

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.