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

Когда печатается имя файла рассола - '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

0
user9755712 6 Ноя 2019 в 06:49
Итак, прежде всего plt.savefig должен быть после метода plt.show. Это соглашение, которому мы должны следовать, иначе сюжет будет отличаться от ожидаемого.
 – 
Hayat
6 Ноя 2019 в 06:56
Вам нужно показать, что вы получите, попробовав приведенный выше код. Ошибка? Результат, который не соответствует вашим ожиданиям?
 – 
mayosten
6 Ноя 2019 в 07:04
На самом деле ей нужно заполнить time = [] count = [], иначе сюжет будет пустым.
 – 
Hayat
6 Ноя 2019 в 07:06
Гупта Что вы получите, попробовав for key,value in Orderdict_variable.keys(): print(key,value)
 – 
Hayat
6 Ноя 2019 в 07:10
Я добавил больше информации в пост
 – 
user9755712
6 Ноя 2019 в 07:51

2 ответа

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

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)

И за махание я изучаю это

0
Nj Nafir 6 Ноя 2019 в 08:58
Это работает! Теперь мне нужно изобразить значения оси x, которые появляются как «711, 2823, 2731, 2752, 2581», но должны быть скорее 0, 100, 200, 300, 400 (согласованные интервалы), поэтому график не является прямая линия (объяснено в сообщении)
 – 
user9755712
6 Ноя 2019 в 19:09
Но это ценность, это посев, результат увеличивается или уменьшается, а зачем нужны ограничения?
 – 
Nj Nafir
6 Ноя 2019 в 19:21
Как упоминалось в сообщении, текущий график выглядит следующим образом - imgur.com/DgG0j9U. Но я хочу, чтобы график отображался вот так (больше похоже на статистику) - imgur.com/muczoUb
 – 
user9755712
6 Ноя 2019 в 20:06
У меня есть результат вашего кода, автоматическое управление интервалами согласованности matplotlib, я не знаю, почему ваш код не отображается в согласованности, вы можете исследовать
 – 
Nj Nafir
6 Ноя 2019 в 20:58
Можете ли вы поделиться точным кодом, который вы используете на своей машине?
 – 
user9755712
6 Ноя 2019 в 21:04

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

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
Nj Nafir 6 Ноя 2019 в 21:44
Если вы добавите sort к count, то значение count, соответствующее этому конкретному времени, изменится, чего не должно происходить. Например, в 2:39 count = 711, в 2:40 count = 2823. Но если вы отсортируете count, то в 2:39 count = 655, в 2:40 count = 711, что неверно. .
 – 
user9755712
6 Ноя 2019 в 22:11
Ранее я уже говорил, что это данные в реальном времени, когда вы заказываете данные не совпадают,
 – 
Nj Nafir
6 Ноя 2019 в 22:16
Вместо того, чтобы думать о чем-либо, вы можете просто заменить последнюю запись каждого счетчика с любого на 0
 – 
Nj Nafir
6 Ноя 2019 в 22:22