【问题标题】:Why do my year-ticks with pandas.plot always show years ending in 9?为什么我使用 pandas.plot 的年份总是显示以 9 结尾的年份?
【发布时间】:2016-05-23 15:58:53
【问题描述】:

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

但默认情况下,我的日期刻度总是以 9 结尾。

为什么会这样,我该如何改变它?以 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()

...这对我来说是这样的:

而且我无法更改末尾的 9,无论我是否设置了 plt.xlim 的窗口,或者我是否更改了 dfdates 的开始和结束年、月或日,所以这并不像“开始数据框+ 10年”或类似的,我的大标题也不会影响这些。

我可能可以为每手设置更合理的刻度,但我更想知道为什么它如此执着于使用年份结尾为 9。

编辑 因此,当我使用@lanery 的答案进行绘图时,会发生以下情况: 请注意我指定自定义刻度的绘图区域中的双刻度(从 1965 年开始)。 我所有的数据框都从 1940 年开始,但很多都是空的,直到我开始获取数据的某个点,这取决于所讨论的数据集。我可以用plt.xlim('1965','2015') 把它删掉,但我把它留在了这个情节中,以显示发生了什么。

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案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()
    

    【讨论】:

    • 它适用于我的示例,但对于真实数据,它不适用。 (或者实际上,它确实,没有错误,并且窗口移动,但 9 的停留)。
    • pandas 绘图更加强调自动格式化绘图,所以我希望设置 xlim 将是重新调整自动选择的主要刻度线的简单方法(尤其是在它适用于您的示例)。由于它没有,您可能需要使用一些自定义进行覆盖,也许这个示例会有所帮助:stackoverflow.com/questions/3486121/…
    • @JC_CL 我更新了我的答案以显示如何设置自定义xticksxticklabels。它基本上只需要 3 行,因此希望将此解决方案应用于您的数据框应该相对轻松(也就是说,如果您还没有找到解决方法)。
    • 谢谢,这很有帮助!但似乎自定义 xticks 只添加到我指定的区域中的 pandas 刻度。所以现在我在指定区域内的 yy10 和 yyy5 有主要刻度(和标签),在 yyy9 和 yyy4 有次要刻度(没有标签)。无论如何,下一步是在inkscape中使用情节的SVG,因此很容易纠正,但我仍然很想知道WTF pandas正在“思考”。
    • 在我原来的问题中添加了一张图片来说明发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多