matplotlib:具有日期时间x轴的条形图导致条形宽度无法控制

时间:2018-12-03 21:56:04

标签: pandas matplotlib

一段时间以来,我一直在努力寻找解决方案。我正在使用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)

Illegible Chart

在进行一些操作之后,这里是用于绘图的数据帧的结构:

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()。

1 个答案:

答案 0 :(得分:1)

此问题通过更改以下行来解决:

barwidth = 0.5

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

其中dataframe.shape[0]等于数据帧中的行数,允许动态调整大小。

更新:此解决方案适用于本文中有问题的图表,但适用于可能遇到此问题的任何人。日期x轴上条形宽度的单位为