繁体   English   中英

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

[英]Multiple side-by-side histograms with matplotlib?

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

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

在此输入图像描述

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

我怎样才能让matplotlib创建这样的情节?

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

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

在此输入图像描述

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM