如何绘制从Pandas DataFrame开始的堆积时间直方图?

时间:2018-09-07 07:37:09

标签: python pandas matplotlib data-science

考虑以下DataFrame import org.springframework.core.env.Environment; public class Example { private boolean skipNextEvent; @Autowired public Example(Environment environment) { skipNextEvent = environment.acceptsProfiles("test"); } @EventListener public void onApplicationEvent(ContextRefreshedEvent event) { if (skipNextEvent) { skipNextEvent = false; return; } startWebSocketConnection(); } // ... }

@ExtendWith(SpringExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest
@ActiveProfiles("test") // set profile "test"
public class WebSocketDataSourceTest {

    @Autowired 
    private Example example;

    @Autowired
    private WebSocketServer server;

    @Test
    public void shouldWork() {
        // ...
        example.onApplicationEvent(null); // trigger manually
        // ...
    }
}

其中有一列具有df dtype,而另一列包含Date Kind 2018-09-01 13:15:32 Red 2018-09-02 16:13:26 Blue 2018-09-04 22:10:09 Blue 2018-09-04 09:55:30 Red ... ... ,该列只能假定有限数量的值(在这种情况下为2)。

您必须在其中绘制日期直方图:

  • 在x轴上,日期(每天的直方图显示月份和日期);
  • 在y轴上,属于该日期的项目数,以堆叠的条形显示蓝色和红色之间的差异。

如何使用Matplotlib实现这一目标?

我当时想做一个set_index并重新采样如下:

datetime64[ns]

但是我丢失了有关每种项数的信息。我也想将任何缺席的日子保持为零。

任何帮助非常感谢。

1 个答案:

答案 0 :(得分:2)

使用groupbycountunstack调整数据框:

df2 = df.groupby(['Date', 'Kind'])['Kind'].count().unstack('Kind').fillna(0)

接下来,重新采样数据框并求和每一天的计数。这还将添加未在数据框(指定)中的所有缺失日期。然后调整索引以仅保留日期部分。

df2 = df2.resample('D').sum()
df2.index = df2.index.date    

现在使用stacked=True绘制数据框:

df2.plot(kind='bar', stacked=True)

enter image description here


或者,plt.bar()函数可用于最终绘图:

cols = df['Kind'].unique() # Find all original values in the column 
ind = range(len(df2))

p1 = plt.bar(ind, df2[cols[0]])
p2 = plt.bar(ind, df2[cols[1]], bottom=df2[cols[0]])

这里有必要将每个部分的bottom参数设置为之前所有部分的总和。