如何在多个matplotlib直方图之间使bin宽度保持一致?

时间:2016-01-20 13:27:57

标签: matplotlib histogram binning

我有一个小函数,用于获取两个数字列表,并使用它们各自的直方图重叠并使用比率图来比较它们。比率图的箱宽度与重叠直方图的箱宽度不一致。如何使比率图具有与叠加直方图相同的箱宽度?

import numpy
import matplotlib.pyplot
import datavision # sudo pip install datavision
import shijian    # sudo pip install shijian

def main():

    a = numpy.random.normal(2, 2, size = 120)
    b = numpy.random.normal(2, 2, size = 120)

    save_histogram_comparison_matplotlib(
        values_1      = a,
        values_2      = b,
        label_1       = "a",
        label_2       = "b",
        normalize     = True,
        label_ratio_x = "frequency",
        label_y       = "",
        title         = "comparison of a and b",
        filename      = "test.png"
    )

def save_histogram_comparison_matplotlib(
    values_1       = None,
    values_2       = None,
    filename       = None,
    number_of_bins = None,
    normalize      = True,
    label_x        = "",
    label_y        = None,
    label_ratio_x  = "frequency",
    label_ratio_y  = "ratio",
    title          = None,
    label_1        = "1",
    label_2        = "2",
    overwrite      = True,
    LaTeX          = False
    ):

    matplotlib.pyplot.ioff()
    if LaTeX is True:
        matplotlib.pyplot.rc("text", usetex = True)
        matplotlib.pyplot.rc("font", family = "serif")
    if number_of_bins is None:
        number_of_bins_1 = datavision.propose_number_of_bins(values_1)
        number_of_bins_2 = datavision.propose_number_of_bins(values_2)
        number_of_bins   = int((number_of_bins_1 + number_of_bins_2) / 2)
    if filename is None:
        filename = shijian.propose_filename(
            filename  = title.replace(" ", "_") + ".png",
            overwrite = overwrite
        )

    values = []
    values.append(values_1)
    values.append(values_2)
    figure, (axis_1, axis_2) = matplotlib.pyplot.subplots(nrows = 2)
    ns, bins, patches = axis_1.hist(
        values,
        normed   = normalize,
        histtype = "stepfilled",
        bins     = number_of_bins,
        alpha    = 0.5,
        label    = [label_1, label_2]
    )
    axis_1.legend()
    axis_2.bar(
        bins[:-1],
        ns[0] / ns[1],
        alpha = 1,
    )
    axis_1.set_xlabel(label_x)
    axis_1.set_ylabel(label_y)
    axis_2.set_xlabel(label_ratio_x)
    axis_2.set_ylabel(label_ratio_y)
    matplotlib.pyplot.title(title)
    matplotlib.pyplot.savefig(filename)
    matplotlib.pyplot.close()

if __name__ == "__main__":
    main()

编辑:临时刮板,因为评论中的编码不合理

import numpy
import matplotlib.pyplot
import datavision
import shijian

def main():

    a = numpy.random.normal(2, 2, size = 120)
    b = numpy.random.normal(2, 2, size = 120)

    save_histogram_comparison_matplotlib(
        values_1      = a,
        values_2      = b,
        label_1       = "a",
        label_2       = "b",
        normalize     = True,
        label_ratio_x = "frequency",
        label_y       = "",
        title         = "comparison of a and b",
        filename      = "test.png"
    )

def save_histogram_comparison_matplotlib(
    values_1       = None,
    values_2       = None,
    filename       = None,
    number_of_bins = None,
    normalize      = True,
    label_x        = "",
    label_y        = None,
    label_ratio_x  = "frequency",
    label_ratio_y  = "ratio",
    title          = None,
    label_1        = "1",
    label_2        = "2",
    overwrite      = True,
    LaTeX          = False
    ):

    matplotlib.pyplot.ioff()
    if LaTeX is True:
        matplotlib.pyplot.rc("text", usetex = True)
        matplotlib.pyplot.rc("font", family = "serif")
    if number_of_bins is None:
        number_of_bins_1 = datavision.propose_number_of_bins(values_1)
        number_of_bins_2 = datavision.propose_number_of_bins(values_2)
        number_of_bins   = int((number_of_bins_1 + number_of_bins_2) / 2)
    if filename is None:
        filename = shijian.propose_filename(
            filename  = title.replace(" ", "_") + ".png",
            overwrite = overwrite
        )

    bar_width = 1
    values = []
    values.append(values_1)
    values.append(values_2)
    figure, (axis_1, axis_2) = matplotlib.pyplot.subplots(nrows = 2)
    ns, bins, patches = axis_1.hist(
        values,
        normed   = normalize,
        histtype = "stepfilled",
        bins     = number_of_bins,
        alpha    = 0.5,
        label    = [label_1, label_2],
        rwidth   = bar_width
    )
    axis_1.legend()
    axis_2.bar(
        bins[:-1],
        ns[0] / ns[1],
        alpha = 1,
        width = bar_width
    )
    axis_1.set_xlabel(label_x)
    axis_1.set_ylabel(label_y)
    axis_2.set_xlabel(label_ratio_x)
    axis_2.set_ylabel(label_ratio_y)
    matplotlib.pyplot.title(title)
    matplotlib.pyplot.savefig(filename)
    matplotlib.pyplot.close()

if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:1)

您需要rwidth来电

中的axis_1.hist(..)参数

您可以调整rwidthbins以匹配axis_2.bar(...)来电(bar的默认宽度为0.8)。

e.g。

matplotlib.pyplot.hist(a,bins=6,rwidth=0.8)

enter image description here