Python 使用matplotlib同时绘制两个直方图时的不透明度误导

Python 使用matplotlib同时绘制两个直方图时的不透明度误导,python,matplotlib,opacity,histogram,Python,Matplotlib,Opacity,Histogram,假设我有两个直方图,我使用hist参数设置不透明度:“alpha=0.5” 我画了两个直方图,但我得到了三种颜色!我从不透明的角度理解这是有道理的 但是!给某人看一张由两个事物组成的三种颜色的图表会让人很困惑。我能不能把每个箱子的最小栏设置在前面,没有不透明 示例图 处理此问题的通常方法是使用一些小间距的绘图。当plt.hist有多组数据时,默认情况下会执行此操作: import pylab as plt x = 200 + 25*plt.randn(1000) y = 150 + 25*pl

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

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

但是!给某人看一张由两个事物组成的三种颜色的图表会让人很困惑。我能不能把每个箱子的最小栏设置在前面,没有不透明

示例图


处理此问题的通常方法是使用一些小间距的绘图。当
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])

您可以使用参数
histtype='barstacked'
)来替换堆叠它们的顺序(这可以在上面完成),但请注意,顺序不正确

这可以通过单独检查每对点来确定哪一个更大,然后使用
zorder
设置哪一个先到来解决。为简单起见,我使用上述代码的输出(例如,n是x和y的每个箱子中点数的两个堆叠阵列):

以下是生成的图像:


通过像这样改变顺序,图像看起来确实很奇怪,这可能就是为什么它没有实现,并且需要黑客来完成。我会坚持使用小分隔法,任何习惯于这些绘图的人都会假设它们采用相同的x值。

如果你不想使用
alpha,你应该包括你用来生成绘图的代码,因为很少有人会为你编写整个代码,而不是修复现有的代码。您用来生成此图的代码是什么?
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)