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()
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 a
x.xaxis_date()
.
It's the same for if I put it before ax.xaxis_date() or after.
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With