熊猫vs matplotlib日期时间

时间:2018-01-20 08:48:39

标签: python pandas datetime matplotlib

我已经在这个网站上阅读了关于datetime和Timestamp以及matplotlib date2num等的一些问题。但是,我很好奇绘制一些数据的“正确”方法是什么。假设我有一个数据框,索引是Pandas DateTimeIndex。我可以直接使用pandas或使用matplotlib绘制数据:

print(dt.index)
# = DatetimeIndex(['2018-01-01 20:00:00', ..., '2018-01-03 04:00:00'],
#                 dtype='datetime64[ns]',
#                 name=u'DateTime',
#                 length=385,
#                 freq=None)

my_axis.plot(df)
print(my_axis.get_xlim())  # = (736695.72708333354, 736697.14791666681)

# vs 

df.plot(ax=my_axis)
print(my_axis.get_xlim())  # = (25247280.0, 25249200.0)

然而,“x轴”的范围在它们之间完全不同。如果我混合绘图(我需要直接使用matplotlib for broken_barh),那么我没有看到所有的数据,因为它们有不同的x坐标。是否有一个公认的最佳做法?

编辑以添加下面的工作示例

如果需要,我愿意升级版本。我试过了:

# Python2 Versions:
Python: 2.7.14
Numpy: 1.13.3
Pandas: 0.20.3
Matplotlib: 2.0.0

# Python3 Version (same results)
Python: 3.6.3
Numpy: 1.12.1
Pandas: 0.19.2
Matplotlib: 2.0.0

如果我只使用pandas绘制x和y,那么它们都会正确显示。如果我只使用matplotlib,那么它们都会正确显示。但是,如果我尝试使用pandas绘制一个,使用matplotlib绘制另一个,则它们不起作用(参见底部的图像)。我的偏好是“通常”使用pandas,因此我只需要在使用matplotlib进行绘图时编辑DateTime索引。我在这里加入了两次评论尝试,但都没有。

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

start = '2018-01-02 03:00:00'
end = '2018-01-02 011:00:00'

data = pd.DataFrame({'DateTime': pd.date_range(start=start, end=end, freq='1H'),
                     'x': [1,2,3,4,5,4,3,2,1],
                     'y': [5,4,3,2,1,2,3,4,5]})
data = data.set_index('DateTime')
#print(data)

ax0 = plt.subplot(211)
ax1 = plt.subplot(212, sharex=ax0)

# Pandas for both
data['x'].plot(ax=ax0)
#data['y'].plot(ax=ax1)

# Matplotlib for both
#ax0.plot(data.index, data['x'])
ax1.plot(data.index, data['y'])

# Other attempts to make matplotlib plot work with pandas
# (but they produce same image as below)
#ax1.plot([mdates.date2num(d) for d in data.index], data['y'])
#ax1.plot(data.index.to_pydatetime(), data['y'])

plt.savefig('test.png')

test.png

1 个答案:

答案 0 :(得分:2)

matplotlib和pandas日期图中的数据单元完全不同。您可以通过不共享任何轴并打印轴限制来找到它。

import pandas as pd
import matplotlib.pyplot as plt

start = '2018-01-02 03:00:00'
end = '2018-01-02 011:00:00'

data = pd.DataFrame({'DateTime': pd.date_range(start=start, end=end, freq='1H'),
                     'x': [1,2,3,4,5,4,3,2,1],
                     'y': [5,4,3,2,1,2,3,4,5]})
data = data.set_index('DateTime')

ax0 = plt.subplot(211)
ax1 = plt.subplot(212)

# Pandas
data['x'].plot(ax=ax0)
# Matplotlib
ax1.plot(data.index, data['y'])

print ax0.get_xlim()  # (420795.0, 420803.0)
print ax1.get_xlim()  # (736696.10833333328, 736696.47500000009)

plt.show()

因此,如果您绘制sharex=ax0范围内的一个轴值和另一个范围内(420795.0, 420803.0)范围内的值,则无法共享轴((736696.108, 736696.475)) 。

因此,如果出于任何原因需要在其中一个共享轴上使用matplotlib图,则还需要将matplotlib用于所有其他共享轴。

相关问题