matplotlib: гистограмма с осью дата-время x, вызывающая неуправляемую ширину бара - PullRequest
0 голосов
/ 04 декабря 2018

Я уже давно пытаюсь найти решение этой проблемы.Я использую панды и 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 (), кажется, рекомендуется во многих местах.

1 Ответ

0 голосов
/ 04 декабря 2018

Эта проблема была решена путем изменения следующей строки:

barwidth = 0.5

на

barwidth = 0.5 * (1 / dataframe.shape[0])

Где dataframe.shape[0] равно количеству строк в кадре данных, что позволяет динамическое изменение размера,

Обновление: Это решение работает для рассматриваемой диаграммы в этом посте, но для всех, кто может столкнуться с этим.Единица измерения ширины бара по оси x составляет days

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...