<div dir="ltr"><div><div><div><div><div><div>Hello everyone,<br><br></div>Having a bit of an adventure controlling the display of the x axis when plotting a pandas dataframe or series using pandas plot(), as in df.plot(kind='bar') or s.plot(kind='bar').<br><br></div>Here's the head of one column:<br><pre>1996-01-01    180.0
1997-01-01    159.0
1998-01-01    159.0
1999-01-01    152.0
2000-01-01    121.0
Name: column A, dtype: float64</pre><br></div>... and here's its index:<br><pre>DatetimeIndex(['1996-01-01', '1997-01-01', '1998-01-01', '1999-01-01',
               '2000-01-01', ... ],
              dtype='datetime64[ns]', freq=None)</pre>I want to show a bunch of subplots, so my code looks like this:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">from datetime import datetime<br>import matplotlib.pyplot as plt<br>import pandas as pd<br>import numpy as np<br>import matplotlib.dates as mdates<br>%matplotlib inline<br><br>fig, axs = plt.subplots(9,2,figsize=(20,20),sharex=True)<br>for i,col in enumerate(df):<br>    ax = df[col].plot(kind='bar',ax=axs[i,0])<br></blockquote></div><blockquote>   etc.<br></blockquote><br></div>... which gives an x tick value for each index item (i.e. each bar), in full datetime format (YYYY-MM-DD 00:00:00), rotated 90 degrees.<br><br></div>I don't want full datetime format, I just want the year portion. Googling the issue led me to trying this:<br><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">fig.autofmt_xdate()<br></blockquote><div><div><div><div><div><br clear="all"><div><div><div><div><div class="gmail_signature"><div>... which rotates the labels, but still in full datetime format.<br><br></div><div>So I tried adding<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">formatter = mdates.DateFormatter('%Y')<br>ax.xaxis.set_major_formatter(formatter)<br></blockquote><br></div><div>which throws this error:<br><pre><span class="gmail-ansi-red-fg">ValueError</span>: DateFormatter found a value of x=0, which is an illegal date.  This usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date()</pre>... which is a bit confusing, since the index is a pandas datetimeindex.<br><br></div><div>Any ideas about how I could get my xaxis to not show just the year portion?<br><br></div><div>Thanks in advance!<br></div><div dir="ltr"><br>Stephen E. Aplin<div>Ottawa Canada</div></div></div></div>
</div></div></div></div></div></div></div></div></div>