I created a plot which looks like
I have a few issues:
- How can i specifically show the weekends. Some ways i had thought were to grab the indices corresponding to weekends and then draw transparent bars between xlims. Also rectangle could be drawn for the same. It would be best if it could be done plainly in Pandas.
- The date formatting is not the most pretty
Following is the code used to generate this plot
ax4=df4.plot(kind='bar',stacked=True,title='Mains 1 Breakdown');
ax4.set_ylabel('Power (W)');
idx_weekend=df4.index[df4.index.dayofweek>=5]
ax.bar(idx_weekend.to_datetime(),[1800 for x in range(10)])
The ax.bar
is specifically for highlighting weekends, but it does not produce any visible output. (Problem 1)
For Problem 2 i tried to use Major Formatter and Locators, the code is as follows:
ax4=df4.plot(kind='bar',stacked=True,title='Mains 1 Breakdown');
ax4.set_ylabel('Power (W)');
formatter=matplotlib.dates.DateFormatter('%d-%b');
locator=matplotlib.dates.DayLocator(interval=1);
ax4.xaxis.set_major_formatter(formatter);
ax4.xaxis.set_major_locator(locator);
The output produced is as follows:
It may be helpful to know what the Dataframe looks like
In [122]:df4
Out[122]:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 36 entries, 2011-04-19 00:00:00 to 2011-05-24 00:00:00
Data columns:
(0 to 6 AM) Dawn 19 non-null values
(12 to 6 PM) Dusk 19 non-null values
(6 to 12 Noon) Morning 19 non-null values
(6PM to 12 Noon) Night 20 non-null values
dtypes: float64(4)
I tried a lot and for now these hacks work. Await a more Pythonic and consistent solutions. Solution to labeling problems:
Also while plotting i make the following change
This makes the labels at 0 rotation.
For finding weekends and highlighting them, i wrote the following two functions:
Now, the plot looks much more useful and covers these use cases.
Now that Pandas supports the powerful
.dt
namespace on every series, it is possible to identify the start and end of each weekend without any explicit Python loops. Simply filter your time values witht.dt.dayofweek >= 5
to select only times falling on the weekend, and then group by a made-up value that is different every week — here I useyear * 100 + weekofyear
because the result looks like201603
which is fairly pleasant to read for debugging.The resulting function is:
Simply pass it the axis and the time series that is your
x
axis, and it will highlight the weekends for you!