Reputation: 4256
having issues using set_xlim
. (possibly because of datetime objects??)
here's my code (doing it in ipython notebook):
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import datetime
date_list = [datetime.datetime(2015, 6, 20, 0, 0), datetime.datetime(2015, 6, 21, 0, 0), datetime.datetime(2015, 6, 22, 0, 0), datetime.datetime(2015, 6, 23, 0, 0), datetime.datetime(2015, 6, 24, 0, 0), datetime.datetime(2015, 6, 25, 0, 0), datetime.datetime(2015, 6, 26, 0, 0)]
count_list = [11590, 10743, 27369, 31023, 30569, 31937, 30205]
fig=plt.figure(figsize=(10,3.5))
ax=fig.add_subplot(111)
width = 0.8
tickLocations = np.arange(7)
ax.set_title("Turnstiles Totals for Lexington Station C/A A002 Unit R051 from 6/20/15-6/26-15")
ax.bar(date_list, count_list, width, color='wheat', edgecolor='#8B7E66', linewidth=4.0)
ax.set_xticklabels(date_list, rotation = 315, horizontalalignment = 'left')
This gives me:
But when I try to make some extra space on the leftmost and rightmost edges with this code:
ax.set_xlim(xmin=-0.6, xmax=0.6)
I get this huge error (this is just the bottom snippet):
223 tz = _get_rc_timezone()
224 ix = int(x)
--> 225 dt = datetime.datetime.fromordinal(ix)
226 remainder = float(x) - ix
227 hour, remainder = divmod(24 * remainder, 1)
ValueError: ordinal must be >= 1
Any idea what's going on guys? thanks!
Upvotes: 1
Views: 88
Reputation: 284562
For various historical reasons, matplotlib uses an internal numerical date format behind-the-scenes. The actual x-values are in this data format, where 0.0 is Jan 1st 1900, and a difference of 1.0 corresponds to 1 day. Negative values aren't allowed.
The error you're getting is because you're trying to set the x-limits to include a negative range. Even without the negative number, though, it would be a range on Jan. 1st, 1900.
Regardless, it sounds like what you're wanting isn't ax.set_xlim
at all. Try ax.margins(x=0.05)
to add 5% padding in the x-direction.
As an example:
import matplotlib.pyplot as plt
import numpy as np
import datetime
count_list = [11590, 10743, 27369, 31023, 30569, 31937, 30205]
date_list = [datetime.datetime(2015, 6, 20, 0, 0),
datetime.datetime(2015, 6, 21, 0, 0),
datetime.datetime(2015, 6, 22, 0, 0),
datetime.datetime(2015, 6, 23, 0, 0),
datetime.datetime(2015, 6, 24, 0, 0),
datetime.datetime(2015, 6, 25, 0, 0),
datetime.datetime(2015, 6, 26, 0, 0)]
fig, ax = plt.subplots(figsize=(10,3.5))
ax.set_title("Turnstiles Totals for Lexington Station C/A A002 Unit R051 from "
"6/20/15-6/26-15")
# The only difference is the align kwarg: I've centered the bars on each date
ax.bar(date_list, count_list, align='center', color='wheat',
edgecolor='#8B7E66', linewidth=4.0)
# This essentially just rotates the x-tick labels. We could have done
# "fig.autofmt_xdate(rotation=315, ha='left')" to match what you had.
fig.autofmt_xdate()
# Add the padding that you're after. This is 5% of the data limits.
ax.margins(x=0.05)
plt.show()
Note that if you wanted to expand the x-limits by exactly 0.6 in each direction, you'd do something like:
xmin, xmax = ax.get_xlim()
ax.set_xlim([xmin - 0.6, xmax + 0.6])
However, ax.margins(percentage)
is much easier as long as you're okay with the "padding" being in terms of a ratio of the current axes limits.
Upvotes: 4