使用matplotlib的多个并排直方图?

时间:2014-09-19 21:35:57

标签: python matplotlib

我有一个软件必须处理大量不同的数据,并且可能需要不同的时间来处理它。随着软件的修改,处理数据所需的时间也会发生变化,所以我想创建一个显示时间差异和异常值的图表,因为理想情况下,这个程序每个部分需要大约相同的时间数据(这听起来很奇怪,不切实际,我知道,但只是在这里和我一起滚动)。

起初,我考虑使用箱形图,但我认为它们是不合适的,因为完全有可能将一半的数据集悬停在一个值附近,另一半围绕另一个徘徊,我感觉不到箱形图将很好地说明。所以我决定尝试使用直方图,但我无法弄清楚如何让matplotlib以我想要的方式绘制它。我想要一个单独的数字,X轴标有软件版本,Y轴显示处理数据集所需的时间,有多个直方图,就像我做的这个模型:

enter image description here

此图表显示在版本0.1中,大多数数据集在2-4秒内处理,由于某种原因需要12秒才能处理一组数据集。 v0.1a摆脱了那些长的异常值,但一切都花了更长的时间。 0.1b比0.1a略快。最后,0.2显示了很大的速度提升,但又引入了异常值。

如何让matplotlib创建这样的情节?

1 个答案:

答案 0 :(得分:5)

这是一个(非常)基本的模型,说明如何实现这一目标:

import matplotlib.pyplot as plt
import numpy as np

number_of_bins = 20
number_of_data_points = 1000

ax = plt.subplot(111)

data_set = [np.random.normal(0, 1, number_of_data_points),
            np.random.normal(6, 1, number_of_data_points),
            np.random.normal(-3, 1, number_of_data_points)]

MID_VALUES = [0, 200, 400]
labels = ["v1", "v2", "v3"]


for MID_VAL, y in zip(MID_VALUES, data_set):

    hist, bin_edges = np.histogram(y, bins=number_of_bins)

    bottom = bin_edges[:-1]
    heights = np.diff(bin_edges)
    lefts = MID_VAL - .5 * hist

    ax.barh(bottom, hist, height=heights, left=lefts)

ax.set_xticks(MID_VALUES)
ax.set_xticklabels(labels)

plt.show()

enter image description here

我承认这缺乏很多改进,例如:手动选择MID_VALUES,这将取决于数据集并且可以自动化。不过,您可以将其变为更有用的格式。