Я уже давно пытаюсь найти решение этой проблемы.Я использую панды и matplotlib, чтобы написать библиотеку черчения.В настоящее время я нахожусь в процессе исправления ошибки в дизайне, который использовал строки вместо отметок времени.Одной из причин этого является ошибка, поскольку она препятствует простому заполнению пропущенных временных меток.
Цель состоит в том, чтобы создать столбчатую диаграмму с накоплением, которая выглядит аналогично следующей диаграмме, но содержит только часть метки времени.(ЧЧ: ММ, ГГГГ-ММ-ДД, ГГГГ-ММ и т. Д.) Эта гистограмма создается с использованием обычного индекса панд.
df = pd.read_csv('/path/to/file.csv', index_col='ts')
Достойный график - недостаточно реп.встраивать изображения еще
После преобразования моего индекса в pandas 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)
Я также пыталсяdataframe.index.to_pydatetime () в функции ax.bar (), которая, кажется, не имеет никакого эффекта.Я пробовал множество вещей, но to_pydatetime (), кажется, рекомендуется во многих местах.