I'm trying to plot multiple time series using a pandas dataframe. The dataframe contains more than 100 registers.
From the panda's documentation I've read that when pandas.df.plot() is executed this is also executed with gcf().autofmt_xdate(). I want to put my custom datetime format but when I tried my custom date format is overlapped over the date given by default by pandas plot. ¿Is there a way to skip gcf().autofmt_xdate() on plot creation? ¿How can i provide to panda a custom datetime format?
Here is the generated plot.
Here is the python code.
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
from pandas import Series
import pickle
datos = pickle.load(open("datos_reporte.pickle", "r"))
reload(plt)
series_o = []
series_p_h = []
series_p_d = []
series_names = []
for cod_estacion in datos.keys():
x = [d[0] for d in datos[cod_estacion]['historial_semanal']]
y = [d[1] for d in datos[cod_estacion]['historial_semanal']]
s = Series(y, x)
series_o.append(s.groupby(level=0).first())
df1 = pd.concat(series_o, join='outer', axis=1)
interval = int(len(df1) / 12)
df1.columns = series_names
ax = plt.figure(figsize=(7,5), dpi=100).add_subplot(111)
df1.plot(ax=ax)
ax.xaxis.set_major_locator(mdates.HourLocator(interval=200))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d-%H:%S'))
ax.xaxis.grid(True, which="minor")
plt.title("Datos observados")
plt.ylabel('Caudal m^3/s')
plt.xlabel('Fecha')
plt.legend(loc=0,prop={'size': 7})
plt.xticks(rotation='vertical', fontsize = 8)
plt.subplots_adjust(bottom=.2)
plt.show()
I think you can just clear all the ticks before you make new ones:
df=pd.DataFrame({'A':np.random.random(20), 'B':np.random.random(20)})
df.index=pd.date_range('1/1/2014', periods=20, freq='5H')
ax = plt.figure(figsize=(7,5), dpi=100).add_subplot(111)
df.plot(ax=ax)
ax.set_xticks([])
ax.set_xticks([], minor=True)
ax.xaxis.set_major_locator(mdates.HourLocator(interval=200))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d-%H:%S'))
ax.xaxis.grid(True, which="minor")
plt.xticks(rotation='vertical', fontsize = 8)
plt.subplots_adjust(bottom=.2)
Now the labels are off. ax.xaxis.set_major_formatter(mdates.DateFormatter('%y/%m/%d-%H:%S'))
will show they are 1991/01/11 and so on.
df=pd.DataFrame({'A':np.random.random(20), 'B':np.random.random(20)})
df.index=pd.date_range('1/1/2014', periods=20, freq='5H')
ax = plt.figure(figsize=(7,5), dpi=100).add_subplot(111)
ax.plot(df.index.to_pydatetime(), df.A, label='A')
ax.plot(df.index.to_pydatetime(), df.B, label='B')
ax.legend()
ax.xaxis.set_major_locator(mdates.HourLocator(interval=5))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%y/%m/%d-%H:%S'))
ax.xaxis.grid(True, which="major")
ax.yaxis.grid(True, which="major")
plt.xticks(rotation='vertical', fontsize = 8)
plt.subplots_adjust(bottom=.2)
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