2

My matplotlib graph is offset by 1 day, but only if I plot the data. What is going on here?

Here's a complete runnable example

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as dt
import matplotlib.ticker as ticker
from datetime import datetime

data = {'Value':[1, 1, 2, 1]} 
df = pd.DataFrame(data, index =[
    datetime(year=2019,month=7,day=30), 
    datetime(year=2019,month=7,day=31), 
    datetime(year=2019,month=8,day=1), 
    datetime(year=2019,month=8,day=2)]) 

display(df)

fig,ax= plt.subplots()
df.plot(ax=ax)
ax.axvline(x=datetime(year=2019,month=8,day=1).date())
ax.xaxis.set_major_locator(dt.MonthLocator())
ax.xaxis.set_major_formatter(dt.DateFormatter('%m-%d'))
ax.xaxis.set_minor_locator(dt.DayLocator())
ax.xaxis.set_minor_formatter(ticker.NullFormatter())
ax.set_xlim(datetime(year=2019,month=7,day=25).date(), 
datetime(year=2019,month=8,day=8).date())

enter image description here

If I don't plot the data but just the vertical line, all is fine...

fig,ax= plt.subplots()
#df.plot(ax=ax)
ax.axvline(x=datetime(year=2019,month=8,day=1).date())
ax.xaxis.set_major_locator(dt.MonthLocator())
ax.xaxis.set_major_formatter(dt.DateFormatter('%m-%d'))
ax.xaxis.set_minor_locator(dt.DayLocator())
ax.xaxis.set_minor_formatter(ticker.NullFormatter())
ax.set_xlim(datetime(year=2019,month=7,day=25).date(), 
datetime(year=2019,month=8,day=8).date())

enter image description here

Philipp
  • 4,659
  • 9
  • 48
  • 69

0 Answers0