【问题标题】:Pandas vs matplotlib datetime熊猫与 matplotlib 日期时间
【发布时间】: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


【解决方案1】:

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()

因此很明显,如果您在一个轴上绘制(420795.0, 420803.0) 范围内的值和另一轴上(736696.108, 736696.475) 范围内的值,则不能共享轴 (sharex=ax0)。

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

【讨论】:

    猜你喜欢
    • 2016-07-05
    • 2019-07-19
    • 2022-10-12
    • 2020-02-21
    • 2015-11-05
    • 2017-02-23
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多