Python 轴标签的 Matplotlib DateFormatter 不起作用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33743394/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 13:53:00  来源:igfitidea点击:

Matplotlib DateFormatter for axis label not working

pythondatepandasmatplotlib

提问by SpicyClubSauce

I'm trying to adjust the formatting of the date tick labels of the x-axis so that it only shows the Year and Month values. From what I've found online, I have to use mdates.DateFormatter, but it's not taking effect at all with my current code as is. Anyone see where the issue is? (the dates are the index of the pandas Dataframe)

我正在尝试调整 x 轴的日期刻度标签的格式,以便它只显示年和月值。从我在网上找到的内容来看,我必须使用mdates.DateFormatter,但是对于我当前的代码,它根本没有生效。有人看到问题出在哪里了吗?(日期是熊猫数据框的索引)

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

fig = plt.figure(figsize = (10,6))
ax = fig.add_subplot(111)

ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))

basicDF['some_column'].plot(ax=ax, kind='bar', rot=75)

ax.xaxis_date()

enter image description here

在此处输入图片说明

Reproducible scenario code:

可重现的场景代码:

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

rng = pd.date_range('1/1/2014', periods=20, freq='m')

blah = pd.DataFrame(data = np.random.randn(len(rng)), index=rng)

fig = plt.figure(figsize = (10,6))
ax = fig.add_subplot(111)

ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))

blah.plot(ax=ax, kind='bar')

ax.xaxis_date()

Still can't get just the year and month to show up.

仍然不能只显示年份和月份。

If I set the format after .plot , get an error like this:

如果我在 .plot 之后设置格式,则会出现如下错误:

ValueError: DateFormatter found a value of x=0, which is an illegal date. This usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date().

ValueError: DateFormatter 发现 x=0 的值,这是一个非法日期。这通常是因为您没有通知轴它正在绘制日期,例如,使用x.xaxis_date().

It's the same for if I put it before ax.xaxis_date() or after.

如果我把它放在 ax.xaxis_date() 之前或之后,它是一样的。

采纳答案by Paul H

pandas just doesn't work well with custom date-time formats.

pandas 不适用于自定义日期时间格式。

You need to just use raw matplotlib in cases like this.

在这种情况下,您只需要使用原始 matplotlib。

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

N = 20
numpy.random.seed(N)

dates = pandas.date_range('1/1/2014', periods=N, freq='m')
df = pandas.DataFrame(
    data=numpy.random.randn(N), 
    index=dates,
    columns=['A']
)

fig, ax = plt.subplots(figsize=(10, 6))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
ax.bar(df.index, df['A'], width=25, align='center')

And that gives me:

这给了我:

enter image description here

在此处输入图片说明

回答by Cilantro Ditrek

The accepted answerclaims that "pandas won't work well with custom date-time formats", but you can make use of pandas' to_datetime()function to use your existing datetime Series in the dataframe:

接受的答案声称“pandas 不适用于自定义日期时间格式”,但您可以利用 pandas 的to_datetime()功能在数据框中使用现有的日期时间系列:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
import pandas as pd

rng = pd.date_range('1/1/2014', periods=20, freq='m')

blah = pd.DataFrame(data = np.random.randn(len(rng)), index=pd.to_datetime(rng))

fig, ax = plt.subplots()

ax.xaxis.set_major_formatter(DateFormatter('%m-%Y'))
ax.bar(blah.index, blah[0], width=25, align='center')

Will result in:

会导致:

a bar graph with the dates formatted as described

带有日期格式的条形图

You can see the different available formats here.

您可以在此处查看不同的可用格式。