Python 如何更改matplotlib绘图的日期时间刻度标签频率?

Python 如何更改matplotlib绘图的日期时间刻度标签频率?,python,pandas,datetime,matplotlib,Python,Pandas,Datetime,Matplotlib,下面显示了模拟数据的绘图,其中包含我要修改的XTICK。默认情况下,pd.df.plot选择相隔约3个月的日期作为刻度。但我想要的是每个月都有一个滴答声。最好的方法是什么?季节性蜱呢?先谢谢你 首先,您必须将pandas日期对象转换为python日期对象。由于matplotlib内部日期转换函数,因此需要进行此转换。然后使用matplotlib.dates中的函数设置所需的格式化程序和勾选位置,如下所示: import pandas as pd import numpy as np import

下面显示了模拟数据的绘图,其中包含我要修改的XTICK。默认情况下,pd.df.plot选择相隔约3个月的日期作为刻度。但我想要的是每个月都有一个滴答声。最好的方法是什么?季节性蜱呢?先谢谢你


首先,您必须将pandas日期对象转换为python日期对象。由于matplotlib内部日期转换函数,因此需要进行此转换。然后使用
matplotlib.dates
中的函数设置所需的格式化程序和勾选位置,如下所示:

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

# convert date objects from pandas format to python datetime
index = pd.date_range(start = "2015-07-01", end = "2017-01-01", freq = "D")
index = [pd.to_datetime(date, format='%Y-%m-%d').date() for date in index]
data = np.random.randint(1,100, size=len(index))
df = pd.DataFrame(data=data,index=index, columns=['data'])
print (df.head())

ax = df.plot()
# set monthly locator
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
# set formatter
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))
# set font and rotation for date tick labels
plt.gcf().autofmt_xdate()

plt.show()
对于季节标签,您必须自行构建,然后使用
plt.setp
功能进行设置(对于02月份设置标签
winter
、04-
spring
等):
plt.setp(新标签,旋转=90,字体大小=9)

国防部负责人:

            data
2015-07-01    26
2015-07-02    33
2015-07-03    46
2015-07-04    69
2015-07-05    17

我很难开始工作,因为我直接使用Matplotlib,而不是绘制Pandas数据集。因此,如果你是其中之一,我的回答可能会有所帮助

使用Matplotlib.plot()打印

这个答案基于

自定义时间序列刻度标签的最佳方法是使用模块(mdates)中的刻度定位器和格式化程序。尽管值得注意的是,如果您希望基于与正在绘制的时间序列相同的单位来确定勾号频率,那么使用日期作为字符串(如答案中的字符串)来创建和格式化勾号标签可能会更方便

如上所述,pandas使用matplotlib为时间序列创建自己的绘图:

pandas为timeseries绘图提供自定义格式设置程序。这些更改了日期和时间轴标签的格式。默认情况下,自定义格式设置程序仅应用于熊猫使用DataFrame.plot()或Series.plot()创建的绘图

熊猫时间序列图的刻度和标签当前的格式默认如下:

import numpy as np                   # v 1.19.2
import pandas as pd                  # v 1.1.3
import matplotlib.dates as mdates     # v 3.3.2

# Create random dataset stored as a pandas DataFrame with a DatetimeIndex
rng = np.random.default_rng(seed=1) # random number generator
date_day = pd.date_range(start='2015-07-01', end='2016-12-31', freq='D')
traffic = rng.lognormal(sigma=2, size=date_day.size)
df_day = pd.DataFrame(dict(traffic=traffic), index=date_day)

# Create pandas plot with default settings except for figure size
df_day.plot(figsize=(10,5));

要能够使用mdates记号定位器和格式设置程序并覆盖默认记号格式,matplotlib必须正确识别熊猫日期。问题在于pandas和matplotlib使用不同的方法计算日期编号,用于在时间轴(默认情况下为x轴)上定位刻度

在pandas中,时间是从零开始(Unix纪元的原点)以纳秒为单位测量的,各个时间点存储为。但是,当涉及到为绘图创建时间刻度时,熊猫使用另一种编号系统,该系统从同一原点开始,然后在所选频率的每个时段增加1(在本例中,频率以天为单位)

Matplotlib使用与熊猫相同的默认原点,但日期始终为:

Matplotlib使用浮点数表示日期,该浮点数指定自默认纪元1970-01-01 UTC起的天数;例如,1970-01-01,06:00是浮点数0.25

使用pandas时,您可以通过运行ax.get_xticks(),使用ax=df.plot(),检查电子秤使用的数字

正如您可能猜到的,这意味着当时间序列的频率以天为单位时,不需要进行日期转换,如下面使用一个简单的自定义标记定位器和格式化程序所示:

ax = df_day.plot(figsize=(10,5))

# Create custom ticks using matplotlib date tick locator and formatter
loc = mdates.MonthLocator(interval=2)
ax.xaxis.set_major_locator(loc)
fmt = mdates.DateFormatter('%b\n%Y')
ax.xaxis.set_major_formatter(fmt)

这种特殊情况便于保留x轴限制和小x记号的其他默认设置。但这是一般规则的例外

为了能够将mdates记号定位器和格式化程序与任何频率类型的时间序列的pandas绘图一起使用,您需要使用(yet and)
x_compat=True
参数。下面的示例演示了将同一数据集重新采样为每月一次的情况。通常情况下,您可能只想稍微调整默认格式,因此在以下示例中,将从头开始重新创建默认格式,以显示可以使用哪些方法来调整它:

# Resample time series to monthly frequency and plot it using date
# numbers that are compatible with mdates
df_month = df_day.resample('MS').sum()
ax = df_month.plot(figsize=(10,5), x_compat=True)

# Set major and minor date tick locators
maj_loc = mdates.MonthLocator(bymonth=np.arange(1,12,2))
ax.xaxis.set_major_locator(maj_loc)
min_loc = mdates.MonthLocator()
ax.xaxis.set_minor_locator(min_loc)

# Set major date tick formatter
zfmts = ['', '%b\n%Y', '%b', '%b-%d', '%H:%M', '%H:%M']
maj_fmt = mdates.ConciseDateFormatter(maj_loc, zero_formats=zfmts, show_offset=False)
ax.xaxis.set_major_formatter(maj_fmt)

ax.figure.autofmt_xdate(rotation=0, ha='center')
ax.set_xlim(df_month.index.min(), df_month.index.max());


文件:

ax = df_day.plot(figsize=(10,5))

# Create custom ticks using matplotlib date tick locator and formatter
loc = mdates.MonthLocator(interval=2)
ax.xaxis.set_major_locator(loc)
fmt = mdates.DateFormatter('%b\n%Y')
ax.xaxis.set_major_formatter(fmt)
# Resample time series to monthly frequency and plot it using date
# numbers that are compatible with mdates
df_month = df_day.resample('MS').sum()
ax = df_month.plot(figsize=(10,5), x_compat=True)

# Set major and minor date tick locators
maj_loc = mdates.MonthLocator(bymonth=np.arange(1,12,2))
ax.xaxis.set_major_locator(maj_loc)
min_loc = mdates.MonthLocator()
ax.xaxis.set_minor_locator(min_loc)

# Set major date tick formatter
zfmts = ['', '%b\n%Y', '%b', '%b-%d', '%H:%M', '%H:%M']
maj_fmt = mdates.ConciseDateFormatter(maj_loc, zero_formats=zfmts, show_offset=False)
ax.xaxis.set_major_formatter(maj_fmt)

ax.figure.autofmt_xdate(rotation=0, ha='center')
ax.set_xlim(df_month.index.min(), df_month.index.max());