plotting with index of objects should use FixedLocator
· Issue #7612 · pandas-dev/pandas (original) (raw)
Navigation Menu
- Explore
- Pricing
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Description
As pointed out here (https://stackoverflow.com/questions/24468333/set-xlim-for-pandas-matplotlib-where-index-is-string/24477138#24477138) if the index of a data frame is objects (that is not, the index obviously convertible to scalars and the data is being plotted against range(len(df))
), the ticklabels are set to be string representations of the objects (I presume via set_xticklabels
) but the locator is still a AutoLocator
which means if you change the xlimits or pan/zoom the axes, the ticklabels become de-coupled from the data.
A solution is to also use a fixed locator which will pin the ticks to only be on the index locations.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
df = pd.DataFrame({'Foo': pd.Series([2,3,4], index=['2002', '2003', '2004'])})
fig, ax = plt.subplots()
df.plot(ax=ax)
ax.xaxis.set_major_locator(mticker.FixedLocator(np.arange(len(df))))
ax.xaxis.set_major_formatter(mticker.FixedFormatter(df.index))
I can make changes to the code if someone points me to where the relevant section is.