如何在熊猫时间序列图中将 xticks 更改为年间隔

Posted

技术标签:

【中文标题】如何在熊猫时间序列图中将 xticks 更改为年间隔【英文标题】:How to change xticks to yearly interval in pandas time series plot 【发布时间】:2019-11-29 06:51:48 【问题描述】:

我对 pandas 很陌生,我每年都搜索了许多类似的 *** 问题来更改 xtick 标签,但它们都不同并没有解决我的问题,所以我决定问自己的问题。

这是我的问题。我有一个模拟数据框,我想在 x 轴上绘制年度 xticks。

import numpy as np
import pandas as pd

df = pd.DataFrame('date': pd.date_range('1991-01-01','2019-01-01')).set_index('date')
df['value'] = np.random.randn(len(df))
df.plot()

这给出: Xticks ==> 1995 2000 2005 等 但我想要 ==> 1991 1992 ... 2019

怎么做?

到目前为止,我已经尝试过:

import matplotlib
import matplotlib
import matplotlib.pyplot as plt

%matplotlib inline

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

ax.xaxis.set_major_locator(matplotlib.dates.YearLocator(base=1))
# ax.xaxis.set_minor_locator(matplotlib.dates.YearLocator(base=1))

# ax.set_xticklabels(list(df.index.time))

这只是 2005 作为 xtick 并且到目前为止没有任何工作。

我查看的链接: - Changing xticks in a pandas plot - Python: Change the time on xticks for Pandas Plot - https://matplotlib.org/3.1.1/api/dates_api.html

【问题讨论】:

【参考方案1】:

您需要使用 x_compat=True 参数让 pandas 以与 matplotlib.dates 定位器和格式化程序兼容的方式选择单位。

df.plot(ax=ax, x_compat=True)

完整代码:

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
df = pd.DataFrame('date': pd.date_range('1991-01-01','2019-01-01')).set_index('date')
df['value'] = np.random.randn(len(df))


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

ax.xaxis.set_major_locator(matplotlib.dates.YearLocator(base=1))
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%Y"))

plt.show()

【讨论】:

只花了大约一个小时寻找在使用熊猫绘图后无法正确设置 xtick 间隔的原因。结果是一个简单的x_compat = True 解决了这个问题。非常感谢。【参考方案2】:

你可以试试这个:

import datetime

# create xticks
 xticks = pd.date_range(datetime.datetime(1990,1,1), datetime.datetime(2020,1,1), freq='YS')

# plot
fig, ax = plt.subplots(figsize=(12,8))
df['value'].plot(ax=ax,xticks=xticks.to_pydatetime())
ax.set_xticklabels([x.strftime('%Y') for x in xticks]); 
plt.xticks(rotation=90);

完整示例

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

# data
df = pd.DataFrame('date': pd.date_range('1991-01-01','2019-01-01')).set_index('date')
df['value'] = np.random.randn(len(df))

# create xticks
xticks = pd.date_range(datetime.datetime(1990,1,1), datetime.datetime(2020,1,1), freq='YS')

# plot
fig, ax = plt.subplots(figsize=(12,8))
df['value'].plot(ax=ax,xticks=xticks.to_pydatetime())
ax.set_xticklabels([x.strftime('%Y') for x in xticks]);
plt.xticks(rotation=90);
plt.show()

这给出:

【讨论】:

以上是关于如何在熊猫时间序列图中将 xticks 更改为年间隔的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib - 将 Xticks 更改为线上的值而不是数据点

在熊猫中将数据类型从对象更改为字符串

如何防止在 Python matplotlib 图中将数字更改为指数形式

如何在 rpart 回归树图中将绘制的数字从科学计数法更改为标准形式?

如何将熊猫时间戳更改为 python 日期时间对象?

如何在 sql server 2008r2 中将行名更改为列名