Создайте MatPlotLib, используя объект python - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу преобразовать объект Python в граф MatPlotLib. Объект python поступает через файл pickle.

Когда печатается имя файла pickle - 'tstpickelFile' (содержащее данные для преобразования), это вывод -

[
OrderedDict([('_time', '2019-11-05T14:39:00.000-08:00'), ('count', '711'), ('_span', '60')]), 
OrderedDict([('_time', '2019-11-05T14:40:00.000-08:00'), ('count', '2823'), ('_span', '60')]), 
OrderedDict([('_time', '2019-11-05T14:41:00.000-08:00'), ('count', '2731'), ('_span', '60')]), 
OrderedDict([('_time', '2019-11-05T14:42:00.000-08:00'), ('count', '2752'), ('_span', '60')]),
OrderedDict([('_time', '2019-11-05T14:42:00.000-08:00'), ('count', '655'), ('_span', '60')])
OrderedDict([('_time', '2019-11-05T14:42:00.000-08:00'), ('count', '1233'), ('_span', '60')])
]
import csv
import numpy as np
import pickle
from collections import Counter
from matplotlib import pyplot as plt

plt.style.use("fivethirtyeight")

infile = open('tstpickelFile','rb')
new_dict = pickle.load(infile)
# print(new_dict)
infile.close()

time = []
count = []

top5 = itertools.islice(new_dict, 5)

for eachDict in top5: 
    for key, value in eachDict.items():
        if(key=="_time"):
                time.append(value)
        if(key=="count"):
                count.append(value)

plt.plot(time, count)

plt.title('Time Count graph')

plt.xlabel('Time')
plt.ylabel('count')

plt.legend()
plt.show()

В настоящее время есть несколько проблем -

  1. Ось X показывает только 711, 2823, 2731, 2752, 2581. Я хочу, чтобы ось X показала 0,100, 200, 300, 400 (постоянные интервалы). Таким образом, линейный график не будет прямой линией (как сейчас). Скорее это будет волнистая линия.

  2. Время должно быть в формате ЧЧ: ММ AM / PM с указанием даты только один раз. Поскольку tstpickelFile может содержать более 50 записей, формат «2019-11-05T14: 39: 00.000-08: 00» займет всю диаграмму.

Это текущий результат - https://imgur.com/DgG0j9U

Вот пример изображения того, как я хотел бы график - https://imgur.com/muczoUb

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Это удивительно, только одна строка кода, это будет возможно, когда список представляет собой отсортированный список, я заметил, что когда значение счетчика сортируется по возрастанию или убыванию в списке, matplotlib автоматически создает консистенцию, поэтому сначала в цикле

if(key=="count"):
        count.append(int(value))

и count.sort() в верхней части определения plt.plot () это исправит правильный подкод:

for each in listcarr: 
    for key, value in each.items():
        if(key=="_time"):
            time.append(value)
        if(key=="count"):
            count.append(int(value))

count.sort()

plt.plot(time, count, '-', lw=2)
0 голосов
/ 06 ноября 2019

Для разделения времени вы можете использовать строковое разбиение, как, я думаю, это решит вашу проблему

for key, value in eachDict.items():
    if(key=="_time"):
            date, time = str(value).split("T")
            h, m, ex, ext = time.split(":")
            if h>12:
                val = str(h-12) + ":" + str(m) + " " + "PM"
            else:
                val = str(h) + ":" + str(m) + " " + "AM"
            time.append(val)
    if(key=="count"):
            count.append(value)

И для размахивания я исследую это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...