【问题标题】:How to draw two stacked histograms side-by-side with Matplotlib/Seaborn如何使用 Matplotlib/Seaborn 并排绘制两个堆叠直方图
【发布时间】:2020-08-19 08:41:19
【问题描述】:

我正在使用下面的代码绘制几个堆叠的直方图。 我对两者都使用相同的 bin 边缘,因此它们可以很好地对齐。

我怎样才能让这些显示在同一个图表上? IE。每个垃圾箱都有一个绿色/红色和一个蓝色/橙色条 - 并排。

我看到许多类似于this 的问题和答案,建议使用条形图并计算条形的宽度,但这似乎应该支持开箱即用,至少在 matplotlib 中是这样。

另外,我可以直接用 seaborn 绘制堆叠直方图吗?我找不到方法。

plt.hist( [correct_a, incorrect_a], bins=edges, stacked=True, color=['green', 'red'], rwidth=0.95, alpha=0.5)

plt.hist( [correct_b, incorrect_b], bins=edges, stacked=True, color=['green', 'red'], rwidth=0.95, alpha=0.5)

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    嗯,我认为plt.bar 是您最好的选择。要创建堆叠直方图,您可以使用其 bottom 参数。要并排显示两个条形图,您可以将 x 值移动一些 width,就像在 this 原始 matplotlib 示例中一样:

    import numpy as np
    import matplotlib.pyplot as plt
    
    fig, ax = plt.subplots(figsize=(16, 8))
    
    correct_a = np.random.randint(0, 20, 20)
    incorrect_a = np.random.randint(0, 20, 20)
    correct_b = np.random.randint(0, 20, 20)
    incorrect_b = np.random.randint(0, 20, 20)
    edges = len(correct_a)
    width=0.35
    
    rects1 = ax.bar(np.arange(edges), incorrect_a, width, color="red", label="incorrect_a")
    rects2 = ax.bar(np.arange(edges), correct_a, width, bottom=incorrect_a, color='seagreen', label="correct_a")
    rects3 = ax.bar(np.arange(edges) + width, incorrect_b, width, color="blue", label="incorrect_b")
    rects4 = ax.bar(np.arange(edges) + width, correct_b, width, bottom=incorrect_b, color='orange', label="correct_b")
    
    # placing the ticks to the middle
    ticks_aligned = np.arange(edges) + width // 2
    ax.set_xticks(np.arange(edges) + width / 2)
    ax.set_xticklabels((str(tick) for tick in ticks_aligned))
    ax.legend()
    

    这会返回:

    【讨论】:

      【解决方案2】:

      这是一个简单的示例(直方图不堆叠),显示 2 个直方图,每个 bin 都有一个并排放置的专用位置:

      # generating some data for this example:
      a = [1,2,3,4,3,4,2,3,4,5,4,3,4,5,4,1,2,3,2,1,3,4,5,6,7,6,5,4,3,4,6,5,4,3,4]
      b = [1,2,3,4,5,6,7,6,5,6,7,6,5,4,3,4,5,6,7,6,7,6,7,5,4,3,2,1,3,4,5,6,5,6,5,6,7,6,7]
      
      # plotting 2 histograms with bars centered differently within each bin:
      plt.hist(a, bins=5, align='left', rwidth=0.5)
      plt.hist(b, bins=5, align='mid', rwidth=0.5, color='r')
      

      【讨论】:

        猜你喜欢
        • 2014-03-12
        • 2018-11-29
        • 2021-04-17
        • 1970-01-01
        • 2019-04-09
        • 2022-01-16
        • 1970-01-01
        • 2017-08-25
        相关资源
        最近更新 更多