【问题标题】:Plotting data from dictionary with dates using Matplotlib使用 Matplotlib 绘制带有日期的字典中的数据
【发布时间】:2018-10-02 19:32:57
【问题描述】:

我正在尝试绘制存储在字典中的一组相当简单的数据。键是日期,当值是..值。但是 x 轴充当正常的一组值,而不是日期。它们按顺序绘制,它们保存在字典中(不是按时间顺序)。x 轴上也没有真正的比例,所以它没有在没有数据的日期上绘制空白区域。

在附加代码中,只有一小部分真正的字典,但足以说明问题:

from matplotlib import pyplot as plt

dictionary = {'2015-11-15': 318, '2015-11-16': 3, '2015-11-18': 147, '2015-11-20': 38, 
'2015-11-22': 128,'2015-11-23': 37, '2015-11-24': 5, '2015-11-25': 3, '2015-11-26': 323, 
'2015-11-27': 478,'2015-11-28': 49, '2015-11-29': 9,'2015-12-11': 172, '2015-12-13': 219, 
'2015-12-16': 1,'2015-12-17': 10, '2015-12-18': 25, '2015-12-19': 3, '2015-12-2': 147, 
'2015-12-21': 133}

x = list(dictionary.keys())
y = list(dictionary.values())

plt.plot_date(x,y, xdate=True)
plt.xticks(x, rotation='vertical')
plt.show()

知道如何编辑代码以正确显示绘图吗?我是否必须对字典进行排序以按时间顺序绘制日期,还是会自动将它们放置在正确的位置?

  1. Link 1 - Date tick labels
  2. Link 2 - matplotlib.pyplot.plot_date
  3. Link 3 - Date Demo Rrule
  4. Link 4 - Dates API

可能的解决方案?

  1. Plotting dates and associated values from a dictionary with Matplotlib

【问题讨论】:

    标签: python python-3.x matplotlib plot


    【解决方案1】:

    好的,所以通过可能的解决方案,我决定将我的数据从字符串 DD-MM-YYYY 格式格式化为元组 (YYYY,MM,DD)。然后我将此信息转发到字典并使用 * 作为 datetime.date 的参数将其解压缩。其余的就像带有链接的示例一样。

    我的程序的完整代码:

    new.txt 中的一小段数据(原始文件超过 12MB):

    =A=
    =A=
    XDD
    29September201821:54
    =F=
    nice,urodzinymateriinieozywionej
    29September201821:54
    =A=
    urodzinygaleriijurajskiejsaxd
    29September201821:53
    =A=
    jakasgwiazdeczka
    29September201821:53
    =F=
    czytakosamaona
    29September201821:53
    =F=
    tenkocertjakoczescewentujakiegoswiekszego
    29September201821:53
    =F=
    nieznaju
    29September201821:52
    =A=
    koncertsylwiigrzeszczakbylxdnawetfajniegraja
    29September201821:48
    =A=
    
    29September201821:48
    =A=
    XDD
    29September201816:03
    =F=
    ladnie
    29September201816:03
    =F=
    wbrystolu
    29September201816:03
    =F=
    niewiemgdziejestem,brawo
    29September201816:03
    =F=
    xD
    29September201816:03
    =F=
    nawetnie
    29September201816:03
    =F=
    anie
    29September201816:03
    =A=
    OMGZUZKAsentaphoto.
    
    29September201816:02
    =F=
    jawbathjestemzjarkiem
    29September201816:02
    =A=
    Niebomalebylyxd
    29September201816:02
    =F=
    cosznalazlaswtychjaskiniach?
    29September201816:02
    =A=
    RondowolsztyniexD
    29September201816:02
    =A=
    OMGZUZKAsentaphoto.
    
    29September201816:02
    =F=
    
    29September201816:01
    =A=
    
    29September201816:01
    =A=
    Oh
    29September201816:01
    =F=
    amniegorszeodrzucaja
    29September201816:01
    =F=
    nie,boinnesazawszegorszenizzuzka
    29September201816:01
    =A=
    Tytakmawiasz?XD
    29September201816:00
    =F=
    kok
    29September201815:51
    =F=
    xd
    29September201815:51
    

    文件的完整代码:

    import re
    from matplotlib import pyplot as plt
    import datetime
    
    def month(date):
        if "January" in date:
            return 1
        elif "February" in date:
            return 2
        elif "March" in date:
            return 3
        elif "April" in date:
            return 4
        elif "May" in date:
            return 5
        elif "June" in date:
            return 6
        elif "July" in date:
            return 7
        elif "August" in date:
            return 8
        elif "September" in date:
            return 9
        elif "October" in date:
            return 10
        elif "November" in date:
            return 11
        elif "December" in date:
            return 12
        else:
            pass
    
    messages = open("new.txt","r").read()
    dates = []
    
    date_2digits = re.finditer('^[0-9][0-9][A-Z][a-z]*[0-9]{6}[:][0-9]{2}', messages, flags=re.MULTILINE)
    date_1digit  = re.finditer('^[0-9][A-Z][a-z]*[0-9]{6}[:][0-9]{2}', messages, flags=re.MULTILINE)
    
    for _ in date_2digits:
        txt = str(_.group(0))
        dates.append((int(txt[-9:-5]),month(txt),int(txt[0:2])))
    
    for _ in date_1digit:
        txt = str(_.group(0))
        dates.append((int(txt[-9:-5]), int(month(txt)), int(txt[0:1])))
    
    dates_dict = {}
    
    for entry in dates:
        date = datetime.date(*entry)
        if date not in dates_dict.keys():
            dates_dict[date]=int(1)
        elif date in dates_dict.keys():
            add = dates_dict[date] + 1
            dates_dict.update({date:add})
    
    x = list(dates_dict.keys())
    y = list(dates_dict.values())
    
    #plt.plot_date(x,y,'.')
    plt.bar(x,y)
    plt.xticks(x, rotation='vertical')
    plt.show()
    

    【讨论】:

    • 回答,但两天后我可以接受。我想与它分享,也许有人会觉得它有帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多