一段时间以来,我一直在努力寻找解决方案。我正在使用pandas和matplotlib编写绘图库。我目前正在纠正使用字符串而不是时间戳的设计错误。这是错误的一个原因,因为它阻止了填充丢失时间戳的任何简便方法。
目标是创建一个堆叠的条形图,该条形图与下图类似,但仅包含一部分时间戳。 (HH:MM,YYYY-MM-DD,YYYY-MM等。)此条形图是使用常规熊猫指数制作的。
df = pd.read_csv('/path/to/file.csv', index_col='ts')
Decent Chart-尚不足以嵌入图像
将索引转换为熊猫DateTimeIndex后,将使用相同的数据生成以下图表。
df = pd.read_csv('/path/to/file.csv', index_col='ts', parse_dates=True, infer_datetime_format=True)
在进行一些操作之后,这里是用于绘图的数据帧的结构:
work_type CYCLECOUNT PICK REPLENISHMENT
ts
2018-10-25 05:00:00 35 0 5
2018-10-25 06:00:00 95 0 1
2018-10-25 07:00:00 125 0 1
2018-10-25 08:00:00 8 0 0
2018-10-25 09:00:00 19 0 3
2018-10-25 11:00:00 0 0 89
2018-10-25 12:00:00 1 0 59
2018-10-25 13:00:00 1 541 208
2018-10-25 14:00:00 0 516 123
2018-10-25 15:00:00 0 390 95
2018-10-25 16:00:00 2 315 167
2018-10-25 17:00:00 0 784 87
2018-10-25 18:00:00 1 521 145
2018-10-25 19:00:00 1 768 196
2018-10-25 20:00:00 0 769 113
2018-10-25 21:00:00 4 785 139
2018-10-25 22:00:00 0 858 81
2018-10-25 23:00:00 2 568 33
2018-10-26 00:00:00 6 530 60
2018-10-26 01:00:00 13 163 50
2018-10-26 02:00:00 12 4 158
2018-10-26 03:00:00 6 5 92
以下是用于生成图表的代码:
def create_stacked_bar_chart(self, dataframe, focus_total, ax: matplotlib.axes.Axes=None,
top_bar_lbls=False, mid_bar_lbls=False, mid_bar_as_percent=False):
i = 0 # part_map keys
k = 0 # pivot_df row index
barwidth = 0.5
part_map = dict()
column_names = dataframe.columns.values
if ax is None:
fig, ax = self.create_figure()
for col in column_names:
if i == 0:
part_map[i] = ax.bar(dataframe.index, dataframe[col].values, barwidth, zorder=3)
else:
barstart = 0
for j in range(i):
barstart += dataframe[column_names[j]]
part_map[i] = ax.bar(dataframe.index, dataframe[col].values, barwidth, bottom=barstart, zorder=3)
我还尝试了ax.bar()函数中的dataframe.index.to_pydatetime()似乎没有任何作用。我尝试了很多事情,但似乎在很多地方都推荐使用to_pydatetime()。
答案 0 :(得分:1)
此问题通过更改以下行来解决:
barwidth = 0.5
到
barwidth = 0.5 * (1 / dataframe.shape[0])
其中dataframe.shape[0]
等于数据帧中的行数,允许动态调整大小。
更新:此解决方案适用于本文中有问题的图表,但适用于可能遇到此问题的任何人。日期x轴上条形宽度的单位为天