Час графіки в Python з Matplotlib


164

У мене є масив часових позначок у форматі (HH: MM: SS.mmmmmm) та інший масив чисел з плаваючою комою, кожне з яких відповідає значенню в масиві часових позначок.

Чи можу я побудувати графік часу на осі x та числа на осі у за допомогою Matplotlib?

Я намагався, але якось це було лише прийняття масивів поплавців. Як я можу змусити його побудувати графік часу? Чи потрібно будь-яким чином змінювати формат?

Відповіді:


178

Спочатку потрібно перетворити часові позначки в datetimeоб’єкти Python (використовувати datetime.strptime). Потім використовуйте date2numдля перетворення дат у формат matplotlib.

Накресліть дати та значення, використовуючи plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)

3
чи буде вона накреслювати Дату чи просто час? Я тільки хочу , щоб час , так як в перерахунку на DateTime, рік встановлений в 1990 році
randomThought

"... при перетворенні в дату, рік встановлений на 1990": Чи можете ви опублікувати код, який ви використовуєте для перетворення з рядка в дату? Щось може бути не так з конверсією. Re. форматування міток діаграм, див. посилання date_demo1, надане JK Seppänen. Документація на ліфти Matplot відмінна, BTW. matplotlib.sourceforge.net/index.html
codeape

14
plot_dates -> matplotlib.pyplot.plot_date (дати, значення)
Піт

3
А як щодо розсіяного сюжету? Я хочу надати масив розмірів, щоб визначити розмір пухирців, але немає еквівалента scatter_date()та очевидного / прямого способу отримання цього графіка.
dwanderson

4
Наведене повертає список з одним об’єктом типу: matplotlib.lines.Line2D об'єктом. Тепер, як я можу це використовувати для показу графіка?
Arindam Roychowdhury

87

Можна також побудувати графік часових позначок і пар значень за допомогою pyplot.plot (після їх розбору з їх рядкового подання). (Тестовано з версіями 1.2.0 та 1.3.1 для matplotlib.)

Приклад:

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()

Створює зображення, подібне до цього:

Діаграма розкиду


4
@andi, це має працювати так само, як у моєму прикладі (змінити plotна scatter).
moooeeeep

1
Я не розумію, чому це п’яте питання, з яким я стикався, коли ніхто насправді НЕ ВІДТВОРИХ, використовуючи схему розкидання - це не працює. Type Error - invalid type promotion.
dwanderson

1
@dwanderson Тоді, можливо, ти робиш щось не так. Я додав у свій приклад приклад схеми розкидання з datetime.datetimeоб'єктами на осі х.
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 від Paul H.

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

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

Все завдяки громаді.


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
осями

Рішення дивною рентгенівської LIMS, щоб встановити їх на своєму власний: stackoverflow.com/questions/21423158 / ...
Qaswed
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.