【问题标题】:Plotting time in Python with Matplotlib使用 Matplotlib 在 Python 中绘制时间
【发布时间】:2010-12-07 03:24:17
【问题描述】:

我有一个格式为 (HH:MM:SS.mmmmmm) 的时间戳数组和另一个浮点数数组,每个数组对应于时间戳数组中的一个值。

我可以使用 Matplotlib 在 x 轴上绘制时间,在 y 轴上绘制数字吗?

我试图这样做,但不知何故它只接受浮点数组。我怎样才能让它绘制时间?我必须以任何方式修改格式吗?

【问题讨论】:

    标签: python graph plot matplotlib


    【解决方案1】:

    您必须首先将时间戳转换为 Python datetime 对象(使用 datetime.strptime)。然后使用date2num将日期转换为matplotlib格式。

    使用plot_date 绘制日期和值:

    import matplotlib.pyplot
    import matplotlib.dates
    
    from datetime import datetime
    
    x_values = [datetime(2021, 11, 18, 12), datetime(2021, 11, 18, 14), datetime(2021, 11, 18, 16)]
    y_values = [1.0, 3.0, 2.0]
    
    dates = matplotlib.dates.date2num(x_values)
    matplotlib.pyplot.plot_date(dates, y_values)
    

    【讨论】:

    • 它会绘制日期还是时间?我只想要转换为日期时间后的时间,年份设置为 1990 年。
    • "...在转换为日期时间时,年份设置为 1990":您能否发布用于从字符串转换为日期时间的代码?转换可能有问题。回覆。图表标签的格式,请参阅 J. K. Seppänen 提供的 date_demo1 链接。顺便说一句,matplot lib 文档非常好。 matplotlib.sourceforge.net/index.html
    • plot_dates --> matplotlib.pyplot.plot_date(dates,values)
    • 散点图怎么样?我想提供一个大小数组来确定分散气泡的大小,但没有等效的scatter_date(),也没有明显/直接的方法来获取此图。
    • 以上返回一个包含一个对象类型的列表:matplotlib.lines.Line2D 对象。现在如何使用它来显示图表?
    【解决方案2】:

    您还可以使用pyplot.plot 绘制时间戳、值对(在从它们的字符串表示中解析它们之后)。 (使用 matplotlib 版本 1.2.0 和 1.3.1 测试。)

    例子:

    import datetime
    import random
    import matplotlib.pyplot as plt
    
    # make up some data
    x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
    y = [i+random.gauss(0,1) for i,_ in enumerate(x)]
    
    # plot
    plt.plot(x,y)
    # beautify the x-labels
    plt.gcf().autofmt_xdate()
    
    plt.show()
    

    生成的图像:


    这里和散点图一样:

    import datetime
    import random
    import matplotlib.pyplot as plt
    
    # make up some data
    x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
    y = [i+random.gauss(0,1) for i,_ in enumerate(x)]
    
    # plot
    plt.scatter(x,y)
    # beautify the x-labels
    plt.gcf().autofmt_xdate()
    
    plt.show()
    

    生成类似这样的图像:

    【讨论】:

    • @andi 它应该像我的示例一样工作(将 plot 更改为 scatter)。
    • 我不明白为什么这是我遇到的第 5 个问题,没有人真正尝试过 使用散点图 - 它不起作用。 Type Error - invalid type promotion.
    • @dwanderson 那么,也许你做错了什么。我在我的帖子中添加了一个散点图示例,其中 x 轴上有 datetime.datetime 对象。
    • 对于网格添加plt.grid(True)
    • @AimForClarity 适用于 matplotlib.__version__ 2.2.2。不过,散点图默认设置了一些过宽的 x 限制。除了手动调整plt.xlim(...)stackoverflow.com/a/46467896/1025391,这个答案似乎提供了一种解决方法
    【解决方案3】:

    7 年后,这段代码帮助了我。 但是,我的时间仍然没有正确显示。

    使用 Matplotlib 2.0.0,我必须添加 Paul H 的 Editing the date formatting of x-axis tick labels in matplotlib 中的以下代码。

    import matplotlib.dates as mdates
    myFmt = mdates.DateFormatter('%d')
    ax.xaxis.set_major_formatter(myFmt)
    

    我将格式更改为 (%H:%M) 并且时间显示正确。

    感谢社区。​​p>

    【讨论】:

      【解决方案4】:

      我在使用 matplotlib 版本时遇到了问题:2.0.2。从上面运行示例,我得到了一组居中堆叠的气泡。

      我通过添加另一行“修复”了问题:

      plt.plot([],[])
      

      整个代码sn-p变成:

      import datetime
      import random
      import matplotlib.pyplot as plt
      import matplotlib.dates as mdates
      
      
      # make up some data
      x = [datetime.datetime.now() + datetime.timedelta(minutes=i) for i in range(12)]
      y = [i+random.gauss(0,1) for i,_ in enumerate(x)]
      
      # plot
      plt.plot([],[])
      plt.scatter(x,y)
      
      # beautify the x-labels
      plt.gcf().autofmt_xdate()
      myFmt = mdates.DateFormatter('%H:%M')
      plt.gca().xaxis.set_major_formatter(myFmt)
      
      plt.show()
      plt.close()
      

      这会产生一个气泡根据需要分布的图像。

      【讨论】:

      • 对我来说在 py2.6 上不起作用。我得到 ValueError: view limit minimum -0.05500000000000001 is less than 1 and is a invalid Matplotlib date value。如果您将非日期时间值传递给具有日期时间单位的轴,这通常会发生
      • 解决奇怪的 x-lims 的方法是自己设置它们:stackoverflow.com/questions/21423158/…
      【解决方案5】:

      尚未提及 Pandas 数据框。我想展示这些如何解决我的日期时间问题。我的日期时间精确到毫秒2021-04-01 16:05:37。我正在从 /proc 中提取 linux/haproxy 吞吐量,因此我可以根据自己的喜好对其进行真正的格式化。这非常适合将数据输入实时图形动画。

      下面是 csv。 (忽略我在另一个图中使用的每秒数据包数列)

      head -2 ~/data
      date,mbps,pps
      2021-04-01 16:05:37,113,9342.00
      ...
      

      通过使用print(dataframe.dtype),我可以看到数据是如何被读取的:

      (base) ➜  graphs ./throughput.py
      date      object
      mbps      int64
      pps       float64
      dtype:    object
      

      Pandas 将日期字符串作为“对象”拉入,这只是 char 类型。在脚本中按原样使用:

      import matplotlib.pyplot as plt
      import pandas as pd
      
      dataframe = pd.read_csv("~/data")
      
      dates = dataframe["date"]
      mbps = dataframe["mbps"]
      
      plt.plot(dates, mbps, label="mbps")
      plt.title("throughput")
      plt.xlabel("time")
      plt.ylabel("mbps")
      plt.legend()
      plt.xticks(rotation=45)
      
      plt.show()
      

      Matplotlib 呈现所有毫秒时间数据。我添加了plt.xticks(rotation=45) 来倾斜日期,但这不是我想要的。我可以将日期“对象”转换为 datetime64[ns]。哪个 matplotlib 知道如何渲染。

      dataframe["date"] = pd.to_datetime(dataframe["date"]) 
      

      这次我的日期是输入datetime64[ns]

      (base) ➜  graphs ./throughput.py
      date    datetime64[ns]
      mbps             int64
      pps            float64
      dtype:          object
      

      相同的脚本有 1 行差异。

      #!/usr/bin/env python
      import matplotlib.pyplot as plt
      import pandas as pd
      
      dataframe = pd.read_csv("~/data")
      
      # convert object to datetime64[ns]
      dataframe["date"] = pd.to_datetime(dataframe["date"]) 
      
      dates = dataframe["date"]
      mbps = dataframe["mbps"]
      
      plt.plot(dates, mbps, label="mbps")
      plt.title("throughput")
      plt.xlabel("time")
      plt.ylabel("mbps")
      plt.legend()
      plt.xticks(rotation=45)
      
      plt.show()
      

      这可能不适合您的用例,但可能对其他人有所帮助。

      【讨论】:

      • 这为我节省了很多时间和挫折,感谢分享!知道如何让 x-lable 日期以日-月-年-小时-分钟的格式显示吗?
      • 酷!是的,创建一个子图来访问 xaxis 属性。这是一条很难显示的评论,但从我上面的示例中添加 fig,ax = plt.subplots() 并在 .show() 之前添加 date_form = DateFormatter("%d-%m-%Y-%H-%M")ax.xaxis.set_major_formatter(date_form)
      猜你喜欢
      • 2021-05-28
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 2016-01-14
      • 2023-04-05
      相关资源
      最近更新 更多