Время печати в Python с Matplotlib

164

У меня есть массив временных меток в формате (ЧЧ: ММ: СС.мммммм) и другой массив чисел с плавающей запятой, каждое из которых соответствует значению в массиве временных меток.

Можно ли изобразить время на оси x и числа на оси y с помощью Matplotlib?

Я пытался, но почему-то принимал только массивы поплавков. Как я могу получить это, чтобы построить время? Должен ли я каким-либо образом изменить формат?

randomThought
источник

Ответы:

178

Сначала вы должны конвертировать ваши метки времени в datetimeобъекты Python (используйте datetime.strptime). Затем используйте date2numдля преобразования дат в формат matplotlib.

График даты и значения, используя plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)
codeape
источник
3
это построит дату или только время? Мне нужно только время с момента преобразования в datetime, год установлен на 1990.
randomThought
«... при преобразовании в datetime год устанавливается на 1990»: не могли бы вы опубликовать код, который вы используете для преобразования из строки в datetime? Что-то может быть не так с преобразованием. Число рейнольдса форматирование меток диаграммы см. по ссылке date_demo1, предоставленной JK Seppänen. Документация по matplot lib отличная, кстати. matplotlib.sourceforge.net/index.html
codeape
14
plot_dates -> matplotlib.pyplot.plot_date (даты, значения)
Пит
3
Как насчет точечного графика? Я хочу предоставить массив размеров, чтобы определить размер пузырьков рассеяния, но нет эквивалента scatter_date()и нет очевидного / прямого способа получить этот график.
dwanderson
4
Выше возвращает список с одним объектом типа: объект matplotlib.lines.Line2D. Теперь, как я могу использовать это, чтобы показать график?
Ариндам Ройховдхури
87

Вы также можете построить временные метки и пары значений, используя 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()

Создает изображение, похожее на это:

Scatter Plot

moooeeeep
источник
4
@ и это должно работать так же, как в моем примере (изменить plotна scatter).
moooeeeep
1
Я не понимаю, почему это пятый вопрос, с которым я столкнулся, когда никто на самом деле не пытался использовать точечный график - он не работает. Type Error - invalid type promotion,
dwanderson
1
@dwanderson Тогда, может быть, вы делаете что-то не так. Я добавил datetime.datetimeв свой пост пример точечной диаграммы с объектами на оси x.
moooeeeep
Для сетки добавитьplt.grid(True)
Кристоф Русси
1
@AimForClarity работает для меня с matplotlib.__version__2.2.2. Тем не менее, на диаграмме рассеяния есть некоторые слишком широкие x-пределы, установленные по умолчанию. Этот ответ, по-видимому, предоставляет обходной путь, отличный от ручной настройки plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep
23

Спустя 7 лет этот код помог мне. Однако, мои времена все еще не показывались правильно.

введите описание изображения здесь

Используя Matplotlib 2.0.0, мне пришлось добавить следующий фрагмент кода из раздела «Редактирование форматирования даты для меток оси x в matplotlib » Пола Х.

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

Я изменил формат на (% H:% M) и время отображается правильно. введите описание изображения здесь

Все благодаря сообществу.

GeorgeLPerkins
источник
16

У меня были проблемы с этим, используя версию Matplotlib: 2.0.2. Запустив пример сверху, я получил набор пузырьков по центру.

график с центрированной стопкой пузырьков

Я «исправил» проблему, добавив еще одну строку:

plt.plot([],[])

Весь фрагмент кода становится:

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: минимальный предел просмотра -0.05500000000000001 меньше 1 и является недопустимым значением даты Matplotlib. Это часто случается, если вы передаете значение, не относящееся к дате / времени, к оси, которая имеет единицы времени и даты <Размер рисунка 432x288 с 1
осями
Решение странных x-lims - установить их самостоятельно: stackoverflow.com/questions/21423158/…
Qaswed