用matplotlib在x轴上绘制datetimeindex会在pandas0.15和0.14中产生错误的刻度

bfhwhh0e  于 2023-08-06  发布在  其他
关注(0)|答案(3)|浏览(74)

我创建了一个简单的pandas dataframe,其中包含一些随机值和一个DatetimeIndex,如下所示:

import pandas as pd
from numpy.random import randint
import datetime as dt
import matplotlib.pyplot as plt

# create a random dataframe with datetimeindex
dateRange = pd.date_range('1/1/2011', '3/30/2011', freq='D')
randomInts = randint(1, 50, len(dateRange))
df = pd.DataFrame({'RandomValues' : randomInts}, index=dateRange)

字符串
然后我用两种不同的方式绘制它:

# plot with pandas own matplotlib wrapper
df.plot()

# plot directly with matplotlib pyplot
plt.plot(df.index, df.RandomValues)

plt.show()


(Do不要同时使用这两个语句,因为它们绘制在同一个图上。)
我使用Python 3.4 64 bitmatplotlib 1.4。对于pandas0.14,两个语句都给予了预期的图(它们使用了稍微不同的x轴格式,这是可以的;注意,数据是随机的,因此图看起来不相同):x1c 0d1x的数据



然而,当使用pandas 0.15时,pandas图看起来不错,但matplotlib图在x轴上有一些奇怪的刻度格式:




这种行为有什么好的理由吗?为什么它从Pandas的0.14变成了0.15?

6tr1vspr

6tr1vspr1#

请注意,这个bug在pandas 0.15.1(https://github.com/pandas-dev/pandas/pull/8693)中得到了修复,plt.plot(df.index, df.RandomValues)现在可以再次工作了。
这种行为变化的原因是从0.15开始,pandas Index对象不再是numpy ndarray子类。但真实的的原因是matplotlib不支持datetime64 dtype。
作为一种解决方法,如果你想使用matplotlib plot函数,你可以使用to_pydatetime将索引转换为python日期时间:

plt.plot(df.index.to_pydatetime(), df.RandomValues)

字符串
更详细的解释:
因为Index不再是ndarray子类,matplotlib会将索引转换为带有datetime64 dtype的numpy数组(而在此之前,它保留了Index对象,其标量作为Timestamp值返回,Timestampdatetime.datetime的子类,matplotlib可以处理)。在plot函数中,它在输入上调用np.atleast_1d(),该输入现在返回datetime64数组,matplotlib将其处理为整数。
我开了一个关于这个的问题(因为这可能会得到很多使用):https://github.com/pydata/pandas/issues/8614

c6ubokkw

c6ubokkw2#

在matplotlib 1.5.0中,这“只是工作”:

import pandas as pd
from numpy.random import randint
import datetime as dt
import matplotlib.pyplot as plt

# create a random dataframe with datetimeindex
dateRange = pd.date_range('1/1/2011', '3/30/2011', freq='D')
randomInts = randint(1, 50, len(dateRange))
df = pd.DataFrame({'RandomValues' : randomInts}, index=dateRange)

fig, ax = plt.subplots()
ax.plot('RandomValues', data=df)

字符串


的数据

30byixjq

30byixjq3#

import matplotlib.pyplot as plt
plt.figure(figsize=(20, 5))
plt.plot(one_label.index.strftime('%Y-%m'),one_label, label='label')
plt.plot(one_pred.index.strftime('%Y-%m'),one_pred.values, label='pred')
plt.legend()
plt.show()

字符串
使用.strftime()可以正常显示日期

相关问题