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元素一起显示数据。 我的问题是两个条形图的输出会产生两个不同的结果。
第一个直接将数据转换为某种连续数据,而第二个更像分类数据。有没有人遇到过与我类似的问题,并且不介意分享解决此问题的方法?
P / s:我尝试过seaborn,它可以工作,但是在某种程度上不能与双轴绘图配合使用。我也用谷歌搜索了类似的问题,但是不知道为什么不是这样的问题?
答案 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()
但是,使用不同的数据时,这些概念之间的差异将更加明显。
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)]
答案 1 :(得分:0)
我不确定如何解决matplotlib
和datetime
的问题,但是pandas
能很好地处理datetime
对象。您可以考虑一下。例如,您可以执行以下操作:
import pandas as pd
df = pd.DataFrame({'date': x, 'value': y})
df.set_index('date').plot.bar()
plt.show()
而且改进也很容易做到:
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()