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

mik*_*ike 7 python matplotlib histogram opacity

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

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

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

示例图

在此输入图像描述

Gre*_*reg 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])
Run Code Online (Sandbox Code Playgroud)

例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)
Run Code Online (Sandbox Code Playgroud)

这是结果图像: 在此输入图像描述

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