python - 使用 matplotlib 从数据框列的日期时间索引将 x 轴设置为年份

标签 python matplotlib

这是代码的简化版本,它解释了我正在尝试做的事情:

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

dates = pd.date_range('20070101',periods=1000)
df = pd.DataFrame(np.random.randn(1000), index = dates, columns =list ('A'))

plt.plot(df['A'])

这导致了这张图:

enter image description here

我想使用日期时间索引中的年份作为此图上 x 轴的标签,而不是数据点数/天数。我想要 2007、2008、2009 等基于日期时间索引(因为这会根据我的输入数据而有所不同)。

为此,我查看了每个帮助站点,但似乎没有任何效果,我可能遗漏了一些非常明显的东西,对此我深表歉意,但我无法弄清楚。

编辑

说明错误的新代码:

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

dates = pd.date_range('20070101',periods=1000)
df = pd.DataFrame(np.random.randn(1000), columns =list ('A'))
df['date'] = dates

def get_season(row):
    if row['date'].month >= 3 and row['date'].month <= 5:
        return 'spring'
    elif row['date'].month >= 6 and row['date'].month <= 8:
        return 'summer'
    elif row['date'].month >= 9 and row['date'].month <= 11:
        return 'autumn'
    else:
        return 'winter'

df['Season'] = df.apply(get_season, axis=1)
df['Year'] = df['date'].dt.year
df.loc[df['date'].dt.month == 12, 'Year'] += 1
df = df.set_index(['Year', 'Season'], inplace=False)

df.head()

fig,ax = plt.subplots()
df.plot(x_compat=True,ax=ax)

ax.xaxis.set_tick_params(reset=True)
ax.xaxis.set_major_locator(mdates.YearLocator(1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))

plt.show()

这给出了错误:

ValueError: ordinal must be >= 1

这好像是来自行

ax.xaxis.set_major_locator(mdates.YearLocator(1))

我认为这与多索引有关,但不明白如何用多索引绘制它。

最佳答案

您可以使用 df.plot 直接从 DataFrame 绘图

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

dates = pd.date_range('20070101',periods=1000)
df = pd.DataFrame(np.random.randn(1000), index = dates, columns =list ('A'))

df.plot()

plt.show()

enter image description here

编辑

为了只显示年份,我们需要通过设置 x_compat=True 来关闭默认的 pandas 日期格式。

然后,我们可以使用 DateLocatorDateFormatter来自 matplotlib.dates只使用年份。

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

dates = pd.date_range('20070101',periods=1000)
df = pd.DataFrame(np.random.randn(1000), index = dates, columns =list ('A'))

fig,ax = plt.subplots()
df.plot(x_compat=True,ax=ax)

ax.xaxis.set_tick_params(reset=True)
ax.xaxis.set_major_locator(mdates.YearLocator(1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))

plt.show()

enter image description here

关于python - 使用 matplotlib 从数据框列的日期时间索引将 x 轴设置为年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549384/

相关文章:

Python : Numpy memory error on creating a 3d array. 填充 3d 数组的更好方法是什么

Python 嵌套 for 循环

python - 使用 pandas.io.json.json_normalize 获取 "AttributeError: ' float' 对象没有属性 'items'“

python - 设置标题和轴标签

python - 将 numpy 数组投影到 aitoff 投影

python - 在 matplotlib 中绘制数据点的计数

python - 在 matplotlib 中使用透明度和多种颜色显示 3D 条形图

python - Pandas dataframe.hist() 更改子图上的标题大小?

python - 当张量的大小未知时是否可以循环?

python - 如何在 matplotlib python 中生成每年发生次数的条形图?