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

时间:2013-08-26 21:45:53

标签: python matplotlib opacity histogram

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

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

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

示例图

enter image description here

1 个答案:

答案 0 :(得分: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值。