用Python绘制带有日期时间基准的stem图。

3
我希望使用matplotlib绘制基于日期时间的stem图。但是似乎出现了错误:
样例代码:
import matplotlib.pyplot as plt
from dateutil import parser

x = parser.parse("2013-9-28 11:00:00")
y = 100

x1 = parser.parse("2013-9-28 12:00:00")
y1 = 200

plt.stem([x,x1],[y,y1],"*-")

错误信息:
    318 
    319     """
--> 320     return array(a, dtype, copy=False, order=order)
    321 
    322 def asanyarray(a, dtype=None, order=None):

TypeError: float() argument must be a string or a number

作为附注,当您发布traceback时,请发布完整的traceback。这样才有用。 - tacaswell
2个回答

1

对上面的回答进行改进,以支持毫秒。

import numpy as np
import matplotlib.pyplot as plt
from time import mktime
from datetime import datetime

def main():
    ticks = [ "2013-9-28 11:00:00.234",
             "2013-9-28 11:00:00.334",
             "2013-9-28 11:00:00.434",
             "2013-9-28 11:00:00.534",
             "2013-9-28 11:00:00.634"]
    y = np.array([10, 12, 9, 15, 11])

    fig = plt.figure(figsize=(4,3))
    ax = fig.add_subplot(1,1,1)
    dtlst = str2dt(ticks)
    ax.stem(dt2msec(dtlst),y)
    bins = 5
    dtlst = list(linspace(dtlst[0],dtlst[-1],bins))
    ax.set_xticks(dt2msec(dtlst))
    ax.set_xticklabels(dt2str(dtlst),rotation=15,ha='right')
    ax.yaxis.grid(True)
    ax.spines['right'].set_visible(False)
    ax.spines['left'].set_visible(False)
    ax.spines['top'].set_visible(False)

    plt.show()    
    return

def str2dt(strlst):
    year = ""#"2014-"
    dtlst = [datetime.strptime(year+i, "%Y-%m-%d %H:%M:%S.%f") for i in strlst]
    return dtlst

def dt2msec(dtlst):
    floatlst = [mktime(dt.timetuple())*1000+dt.microsecond/1000 for dt in dtlst]
    return floatlst

def dt2str(dtlst):
    dtstr = [dt.strftime("%Y-%m-%d %H:%M:%S.%f %Z%z") for dt in dtlst]
    return dtstr

def msec2dt(msecs):
    dtlst = [datetime.fromtimestamp(msecs/1000.0).replace(microsecond=msecs%1000*1000) for msecs in floatlst]
    return dtlst

def linspace(start, end, bins):
    delta = (end - start)/bins
    x = start
    while x <= end:
        yield x
        x = x + delta
    return

#-----------------------------------------#
if __name__ == "__main__":
    main()
#-----------------------------------------#

输出:

enter image description here


1

看起来stem x轴只支持浮点数,因此可以将您的日期转换为时间戳(浮点数),然后进行绘图。要在轴上显示日期,请使用.xticks()。以下是示例:

import numpy as np
import matplotlib.pyplot as plt
from time import mktime
from datetime import datetime

ticks = [ "2013-9-28 11:00:00.234", "2013-9-28 11:10:00.123", "2013-9-28 11:40:00.654", "2013-9-28 11:50:00.341", "2013-9-28 12:00:00.773"]
y = np.array([10, 12, 9, 15, 11])
x = [mktime(datetime.strptime(i, "%Y-%m-%d %H:%M:%S.%f").timetuple()) for i in ticks]

plt.stem(x,y)
plt.xticks(x, ticks)
plt.show()

enter image description here


好的建议,一个问题是我的时间格式是2013-11-04 20:54:56.571,还有.571秒,所以API会报错:ValueError: unconverted data remains: .571,我该如何解决? - lucky1928
1
没问题,你可以将格式更改为%Y-%m-%d %H:%M:%S.%f。请查看更新后的答案。无论如何,这与你的问题无关。 - jabaldonedo
pyplot.stem() 的代码可以很容易地修改以绘制日期,但我不确定这是否会破坏任何东西。我已经在 https://github.com/matplotlib/matplotlib/issues/2938 上开了一个票。 - Eric O. Lebigot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接