Home Articles

使用matplotlib同时绘制两个直方图时,不透明度会产生误导

Asked
Viewed 1705 times
7

假设我有两个直方图,并使用hist参数设置不透明度:'alpha = 0.5'

我已经绘制了两个直方图但我得到了三种颜色!从不透明的角度来看,我理解这是有道理的 .

但!向某人展示三种颜色的两件事的图表是非常令人困惑的 . 我可以以某种方式将每个箱子的最小条形设置在前面而没有不透明度吗?

示例图

enter image description here

1 Answer

  • 8

    处理这个问题的通常方法是使图表有一些小的分离 . 当 plt.hist 被赋予多组数据时,默认情况下会这样做:

    import pylab as plt
    
    x = 200 + 25*plt.randn(1000)
    y = 150 + 25*plt.randn(1000)
    n, bins, patches = plt.hist([x, y])
    

    Example 1

    你改为堆叠它们(这可以在上面使用参数 histtype='barstacked' 完成),但请注意排序是不正确的 .

    这可以通过单独检查每对点来查看哪个更大,然后使用 zorder 来设置哪一个是第一个来修复 . 为简单起见,我使用上面代码的输出(例如,n是x和y的每个bin中的点数的两个堆叠数组):

    n_x = n[0]
    n_y = n[1]
    for i in range(len(n[0])):
        if n_x[i] > n_y[i]:
            zorder=1
        else:
            zorder=0
        plt.bar(bins[:-1][i], n_x[i], width=10)
        plt.bar(bins[:-1][i], n_y[i], width=10, color="g", zorder=zorder)
    

    以下是生成的图像:
    enter image description here

    通过改变这样的顺序,图像看起来非常奇怪,这可能就是为什么它没有实现并需要黑客来做它 . 我会坚持使用小分离方法,任何习惯这些图的人都假设它们采用相同的x值 .

Related