带有日期时间的python matplotlib中的barplot行为异常

时间:2018-11-21 03:31:28

标签: python datetime matplotlib bar-chart visualize

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 :(得分:1)

我不确定是否将观察到的行为称为意外。在第一种情况下,您需要为条形图的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

答案 1 :(得分:0)

我不确定如何解决matplotlibdatetime的问题,但是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