【发布时间】:2018-06-29 11:13:22
【问题描述】:
我已经阅读了该站点上有关 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 用于 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')
【问题讨论】:
-
不,没有“最佳实践”。通常使用 pandas 更容易,而 matplotlib 允许更多控制。在任何情况下,由于使用了不同的日期格式约定,将两者混合通常会导致问题。
-
这几乎就是我发现的。我正在绘制大约 4 个图,我更喜欢只使用 pandas,但如果它们(broken_barh),我需要使用 matplotlib。有没有办法让 matplotlib 使用熊猫的日期?
-
是的。如果您想通过使用问题的minimal reproducible example 来显示您遇到的问题,并明确说明您拥有哪些版本,这里可能会有所帮助。
-
向 OP 添加了一个工作示例
-
看到这个,在尝试漫无目的地使用
matplotlib.date.num2date时有些头疼...有趣的是时间约定可能会有所不同。
标签: python pandas datetime matplotlib