ConciseDateFormatter in subplots

Viewed 87

Using mdates.ConciseDateFormatter in multiple subplots gives erroneous offset in the axis:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

dti = pd.to_datetime(["2016-08-31", "2016-09-30"])
ts0 = pd.DataFrame({"x": [0, 1]}, index=dti)
ts1 = pd.DataFrame({"x": [0, 1]}, index=dti + pd.Timedelta(365, "D"))
fig, axs = plt.subplots(2, 1, sharex=False)
ts0["x"].plot(ax=axs[0], marker="o")
ts1["x"].plot(ax=axs[1], marker="o")
dlocator = mdates.AutoDateLocator(minticks=6, maxticks=9)
axs[0].xaxis.set_major_locator(dlocator)
axs[0].xaxis.set_major_formatter(mdates.ConciseDateFormatter(dlocator))
axs[1].xaxis.set_major_locator(dlocator)
axs[1].xaxis.set_major_formatter(mdates.ConciseDateFormatter(dlocator))

mdates_bug

The figure shows the x-axis tick labels for the top plot got messed up when assigning the major locator and formatter to the bottom plot. Is there any workaround to this bug or problem?

1 Answers

Plot Setup Code

fig, axs = plt.subplots(2, 1, sharex=False, figsize=(7, 7))
# axs = axs.flatten()  # required to easily index subplots, if subplots >= 2x2
ts0["x"].plot(ax=axs[0], marker="o")
ts1["x"].plot(ax=axs[1], marker="o")

Option 1

# instantiate AutoDateLocator
locator = mdates.AutoDateLocator(minticks=6, maxticks=9)
axs[0].xaxis.set_major_locator(locator)
axs[0].xaxis.set_major_formatter(mdates.ConciseDateFormatter(locator))

# instantiate AutoDateLocator
locator = mdates.AutoDateLocator(minticks=6, maxticks=9)
axs[1].xaxis.set_major_locator(locator)
axs[1].xaxis.set_major_formatter(mdates.ConciseDateFormatter(locator))

fig.tight_layout()

Option 2

for ax in axs:
    # instantiate AutoDateLocator
    locator = mdates.AutoDateLocator(minticks=6, maxticks=9)
    formatter = mdates.ConciseDateFormatter(locator)
    ax.xaxis.set_major_locator(locator)
    ax.xaxis.set_major_formatter(formatter)

fig.tight_layout()

Plot Result

enter image description here

Related