Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib DateFormatter for axis label not working

Tags:

I'm trying to adjust the formatting of the date tick labels of the x-axis so that it only shows the Year and Month values. From what I've found online, I have to use mdates.DateFormatter, but it's not taking effect at all with my current code as is. Anyone see where the issue is? (the dates are the index of the pandas Dataframe)

import matplotlib.dates as mdates import matplotlib.pyplot as plt import pandas as pd   fig = plt.figure(figsize = (10,6)) ax = fig.add_subplot(111)  ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))  basicDF['some_column'].plot(ax=ax, kind='bar', rot=75)  ax.xaxis_date() 

enter image description here

Reproducible scenario code:

import numpy as np import matplotlib.dates as mdates import matplotlib.pyplot as plt import pandas as pd   rng = pd.date_range('1/1/2014', periods=20, freq='m')  blah = pd.DataFrame(data = np.random.randn(len(rng)), index=rng)  fig = plt.figure(figsize = (10,6)) ax = fig.add_subplot(111)  ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))  blah.plot(ax=ax, kind='bar')  ax.xaxis_date() 

Still can't get just the year and month to show up.

If I set the format after .plot , get an error like this:

ValueError: 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().

It's the same for if I put it before ax.xaxis_date() or after.

like image 277
SpicyClubSauce Avatar asked Nov 16 '15 19:11

SpicyClubSauce


1 Answers

pandas just doesn't work well with custom date-time formats.

You need to just use raw matplotlib in cases like this.

import numpy import matplotlib.pyplot as plt import matplotlib.dates as mdates import pandas  N = 20 numpy.random.seed(N)  dates = pandas.date_range('1/1/2014', periods=N, freq='m') df = pandas.DataFrame(     data=numpy.random.randn(N),      index=dates,     columns=['A'] )  fig, ax = plt.subplots(figsize=(10, 6)) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) ax.bar(df.index, df['A'], width=25, align='center') 

And that gives me:

enter image description here

like image 76
Paul H Avatar answered Sep 20 '22 18:09

Paul H