【发布时间】:2017-05-30 22:41:09
【问题描述】:
我正在尝试使用 matplotlib 在堆叠的水平条形图中绘制用户在不同任务上花费的时间量。 x轴是时间。条形图的每个部分代表在任务上花费的时间量。但是,我得到了一个格式不正确的意外图表。图表的格式要求我在图表上放大很远才能看到所有的条形图。
该图确实符合我的需要,但起初它看起来像这样:original graph
为了得到这个,我必须放大很远:zoomed-in graph
除了第一个和最后一个数据点之外,放大后的图表似乎具有正确的条形比例。
我的数据是timedelta 对象的列表,因此可以将它们添加在一起。我正在将它们转换为 datetime 对象以绘制数据。
给我不想要的结果的代码是:
import matplotlib.pyplot as plt
from datetime import datetime
from datetime import timedelta
import matplotlib.dates as dt
def sum_times(data, N):
'''sums the first N datetime elements in a list
changes from timedelta object to datetime object
'''
# initialize
summ = datetime(1900, 1, 1, 0, 0, 0)
for i in range(len(data[0:N])):
summ += data[i]
return summ
start_date = datetime(1900, 1, 1, 0, 0, 0)
times = [timedelta(0, 737),
timedelta(0, 110),
timedelta(0, 356),
timedelta(0, 171),
timedelta(0, 306)]
fig, ax1 = plt.subplots(1,1, sharex=True, sharey=True)
ax1.set_title("Bug being fixed")
ax1.set_xlabel('time')
ax1.xaxis_date()
# the graph uses datetime objects
ax1.barh(1, times[0] + start_date)
ax1.barh(1, times[1] + start_date, left=sum_times(times, 1))
ax1.barh(1, times[2] + start_date, left=sum_times(times, 2))
ax1.barh(1, times[3] + start_date, left=sum_times(times, 3))
ax1.barh(1, times[4] + start_date, left=sum_times(times, 4))
ax1.set_xticks(range(1,10)) # arbitrary
plt.show()
如何更改格式?
我曾尝试将ax1.set_xticklabels() 与datetime 或timedelta 对象一起使用,但出现异常:ValueError: ordinal must be >= 1。
当我使用时
ax1.xaxis.set_major_locator(dt.MinuteLocator(interval=60))
ax1.xaxis.set_major_formatter(dt.DateFormatter('%M:%S'))
格式仍然不正确。
我正在使用 python 3.6、matplotlib、PyDev IDE 和 Windows 8。
如果有任何库更适合显示此类数据或可以补充 matplotlib/pyplot,我将不胜感激使用一个解决方案。
另外,我尝试使用循环自动调用ax1.barh(...),但图形窗口不显示并且变得无响应。由于我想绘制更大的数据集,我可以使用更优雅的解决方案。
【问题讨论】:
标签: python python-3.x datetime matplotlib graph