Странное поведение barplot из python matplotlib с datetime - PullRequest
0 голосов
/ 21 ноября 2018
import matplotlib.pyplot as plt
import datetime
x = [datetime.datetime(1943,3, 13,12,0,0),
     datetime.datetime(1943,3, 13,12,5,0),
     datetime.datetime(1943,3, 13,12,10,0),
     datetime.datetime(1943,3, 13,12,15,0),
     datetime.datetime(1943,3, 13,12,20,0),
     datetime.datetime(1943,3, 13,12,25,0),
     datetime.datetime(1943,3, 13,12,30,0),
     datetime.datetime(1943,3, 13,12,35,0)]
y = [1,2,3,4,2,1,3,4]

# plot the data out but does not provide sufficient detail on the lower    values
plt.figure()
plt.bar(x,y)

# plot the data out but ommit the datetime information
plt.figure()
plt.bar(range(0,len(x)),y)

Привет, ребята, я только начинаю с matplotlib при переходе от matlab к python.Однако я столкнулся со странным поведением matplotlib, так как он не может отображать данные вместе с элементом datetime.Мой вопрос здесь будет вывод обоих гистограмм дают два разных результата.

enter image description here

Первый напрямую преобразует данные в некие непрерывные данные, а второй больше похож на категориальные данные.Кто-нибудь сталкивался с подобной проблемой, как у меня, и не против поделиться своим подходом к этому?

P / s: я пробовал seaborn, и это работает, но как-то не очень хорошо работает с двухосной прорисовкой.Я также гуглил на подобную проблему, но как-то не такая проблема?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

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

Поскольку вы не сказали, кого из них вы предпочитаете, решение состоит в том, чтобы сделать их обоих визуально равными.Тем не менее, соответствующая концепция отличается.

import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
import datetime
x = [datetime.datetime(1943,3, 13,12,0,0),
     datetime.datetime(1943,3, 13,12,5,0),
     datetime.datetime(1943,3, 13,12,10,0),
     datetime.datetime(1943,3, 13,12,15,0),
     datetime.datetime(1943,3, 13,12,20,0),
     datetime.datetime(1943,3, 13,12,25,0),
     datetime.datetime(1943,3, 13,12,30,0),
     datetime.datetime(1943,3, 13,12,35,0)]
y = [1,2,3,4,2,1,3,4]

# plot numeric plot
plt.figure()
plt.bar(x,y, width=4./24/60) # 4 minutes wide bars
plt.gca().xaxis.set_major_formatter(DateFormatter("%H:%M"))

# Plot categorical plot
plt.figure()
plt.bar(range(0,len(x)),y, width=0.8) # 0.8 units wide bars
plt.xticks(range(0,len(x)), [d.strftime("%H:%M") for d in x])

plt.show()

enter image description here

Однако разница между концепциями будет более очевидной при использовании различных данных,

x = [datetime.datetime(1943,3, 13,12,0,0),
     datetime.datetime(1943,3, 13,12,5,0),
     datetime.datetime(1943,3, 13,12,15,0),
     datetime.datetime(1943,3, 13,12,25,0),
     datetime.datetime(1943,3, 13,12,30,0),
     datetime.datetime(1943,3, 13,12,35,0),
     datetime.datetime(1943,3, 13,12,45,0),
     datetime.datetime(1943,3, 13,12,50,0)]

enter image description here

0 голосов
/ 21 ноября 2018

Я не уверен, как решить проблемы с matplotlib и datetime, но pandas очень хорошо обрабатывает datetime объекты.Вы можете рассмотреть это.Например, вы можете сделать следующее:

import pandas as pd
df = pd.DataFrame({'date': x, 'value': y})
df.set_index('date').plot.bar()
plt.show()

pandas result

И улучшения тоже довольно просты:

df = pd.DataFrame({'date': x, 'value': y})
df['date'] = df['date'].dt.time 
df.set_index('date').plot.bar(rot=0, figsize=(10, 5), alpha=0.7)
plt.show()

Image 2

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