为什么我的pandas.plot年份也会显示以9结尾的年份?

时间:2016-05-23 15:58:54

标签: python pandas matplotlib

我正在使用pandas内置.plot命令来绘制一些长时间的系列。

但我的日期标记始终是默认为9的年份。screenshot of plot

为什么会如此,我该如何改变呢?以0结尾的年份看起来会更好。

尝试使用plt.xlim('1966', '2013')或类似的东西来设置轴的窗口也不会对以9结尾的情节(和4,如果你“放大”,如上所示)的情节做任何事情。

它似乎与源数据框中的日期的开始和结束没有任何关系。

这是一个最小的,空的,例如:

dfdates = pd.date_range('01/01/1942', '01/01/2018', freq = 'MS')
dfzeros = np.zeros((len(dfdates)))
header_test = pd.MultiIndex.from_product([['zero'],['zero'], ['zero'], ['zero'], ['zero'], ['zero']], names = ['stuff1', 'stuff2', 'stuff3', 'stuff4', 'stuff5', 'stuff6'])
Big_df = pd.DataFrame(dfzeros, index = dfdates, columns = header_test)

Big_df.plot()
plt.show()

......这导致了我: empty test plot

我无法在最后更改9,无论我是否设置了plt.xlim的窗口,或者我是否更改dfdates的开始和结束年,月或日,所以它不是简单的“数据帧开始+ 10年”或类似,我的大标题也不会影响那些。

我可能会为每只手设置更合理的蜱虫,但我宁愿知道为什么它会如此倾向于使用年末9岁。

修改 因此,当我使用@ lanery的答案绘制时会发生什么: plot with double ticks 请注意我在指定自定义刻度(从1965年开始)的绘图区域中的双刻度。 我的所有数据帧都是从1940年开始的,但很多都是空的,到了我开始获取数据的某个点,具体取决于所讨论的数据集。我可以用plt.xlim('1965','2015')来删除它,但我把它留在这个情节中,以显示发生了什么。

1 个答案:

答案 0 :(得分:1)

plt.xlim设置datetime个对象后,就像

一样
plt.xlim(pd.datetime(1966, 1, 1), pd.datetime(2013, 1, 1))

没有做到这一点,我认为最好的做法是设置自定义xticksxticklabels。这可以通过类似的方式完成

dates = pd.date_range('1990', '2015', freq=pd.DateOffset(years=5))
ax.xaxis.set_ticks(dates)
ax.xaxis.set_ticklabels(dates.strftime('%Y'))

包含一些随机数据的完整示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(17)
years = pd.date_range(pd.datetime(1990, 1, 1), pd.datetime(2015, 1, 1), freq='MS')
random_data = np.asarray(np.split(np.cumsum(np.random.randn(years.size*3)), 3)).T
df = pd.DataFrame(random_data, columns=['A', 'B', 'C'], index=years)

# all of the relevant plotting and xtick formatting
fig = plt.figure()
ax = fig.add_subplot(111)

df.plot(ax=ax)

# select range of years for the x-axis as well as major tick spacing
dates = pd.date_range('1990', '2015', freq=pd.DateOffset(years=5))
ax.xaxis.set_ticks(dates)
ax.xaxis.set_ticklabels(dates.strftime('%Y'))
# dates.strftime('%Y') = (['1990', '1995',...,'2010', '2015'])

ax.grid()

enter image description here