【问题标题】:Python Matplotlib x-axis improperly labels timedelta64 objectPython Matplotlib x 轴不正确地标记 timedelta64 对象
【发布时间】:2017-02-14 02:30:44
【问题描述】:

我正在尝试使用 Matplotlib 从 Python 中的 Pandas 数据框生成图。这是数据框的摘要。

import pandas as pd
import datetime
import matplotlib.pyplot as plt

# Summarize data frame.
>>> df.shape
(40, 4)

>>> df.dtypes
ID                         object
relative_time     timedelta64[ns]
value                     float64
relative_value            float64
dtype: object

>>> df.head()
    ID     relative_time  value  relative_value
0  001 -1 days +18:08:04    4.5            -1.0
1  001 -1 days +18:18:03    4.5            -1.0
2  001 -1 days +18:28:03    4.5            -1.0
3  001 -1 days +18:38:04    4.5            -1.0
4  001 -1 days +18:48:03    4.5            -1.0

>>> df.tail()
     ID     relative_time  value  relative_value
35  001 -1 days +23:58:03    5.5             0.0
36  001          00:08:03    5.5             0.0
37  001          00:18:03    5.5             0.0
38  001          00:28:02    5.5             0.0
39  001          00:38:04    5.5             0.0

我试图在 x 轴上绘制 relative_time,在 y 轴上绘制 relative_value。然而,下面的代码产生了一个意想不到的结果,我无法判断 x 轴的单位是什么。

# Plot the desired plot.
plt.plot(test['relative_time'], test['relative_value'], marker='.')

请注意,上图中的 x 轴不是以小时为单位(相对于时间 0)。这样的情节如下所示。

plt.plot(test['relative_time'] / np.timedelta64(1, 'h'), test['relative_value'], marker='.')

如何绘制 x 轴,以便它以与 relative_time 列相同的格式显示时间?例如,如果 x 轴每小时都有刻度线,它们将被标记为 -1 days +18:00:00-1 days +19:00:00、...、00:00:0001:00:00

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    x 轴的单位是纳秒,如您的输出所示

    >>> df.dtypes
    ID                         object
    relative_time     timedelta64[ns]  <----- [ns] == nanoseconds
    value                     float64
    relative_value            float64
    dtype: object
    

    看起来 matplotlib 只显示纳秒,因此您需要将这些纳秒格式化为字符串格式。不幸的是,numpy.timedelta64 数据类型的功能是有限的,我在numpy 文档中找不到任何可以做到这一点的东西。

    示例Formatted x-axis labels

    来源:matplotlib intelligent axis labels for timedelta

    import datetime
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    

    创建一个包含np.timedelta64[ns] 值的数组。如果你这样做了df["relative_time"].values,这就是你会得到的。

    # create list of times
    x = [np.timedelta64(k, "ns") for k in range(0,300*10**9,10**9)]
    
    # create some random y-axis data
    y = np.random.random(len(x))
    
    ax.plot(x, y)
    
    # Function that formats the axis labels
    def timeTicks(x, pos):
        seconds = x / 10**9 # convert nanoseconds to seconds
        # create datetime object because its string representation is alright
        d = datetime.timedelta(seconds=seconds)
        return str(d)
    
    formatter = matplotlib.ticker.FuncFormatter(timeTicks)
    ax.xaxis.set_major_formatter(formatter)
    plt.show()
    

    【讨论】:

    • 你能编辑在ax.plot(x, y)之前定义ax吗?编写的代码返回NameError: name 'ax' is not defined。您可能还想在顶部添加import matplotlib
    • @Adam 完成。谢谢。
    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多