Python 2.7 matplotlib';s alpha透明度值为“0”;sum";到1号?

Python 2.7 matplotlib';s alpha透明度值为“0”;sum";到1号?,python-2.7,matplotlib,alpha,Python 2.7,Matplotlib,Alpha,我正在使用matplotlib绘制一系列重叠的水平线。我想指出(以非常粗略的方式)通过透明度有多少重叠。例如,如果我有10行,其中5行在某个间隔上重叠,我希望该间隔的alpha值为0.5。如果它们在某个间隔上重叠,则该间隔的alpha值应为1.0。下面的代码应该说明我想要什么: import matplotlib.pyplot as plt y = [1,1,1,1,1,1,1,1,1,1] x_start = [0,0,0,0,0,0,0,0,0,0] x_end = [1,2,3,4,5,

我正在使用matplotlib绘制一系列重叠的水平线。我想指出(以非常粗略的方式)通过透明度有多少重叠。例如,如果我有10行,其中5行在某个间隔上重叠,我希望该间隔的alpha值为0.5。如果它们在某个间隔上重叠,则该间隔的alpha值应为1.0。下面的代码应该说明我想要什么:

import matplotlib.pyplot as plt

y = [1,1,1,1,1,1,1,1,1,1]
x_start = [0,0,0,0,0,0,0,0,0,0]
x_end = [1,2,3,4,5,6,7,8,9,10]

plt.hlines(y, x_start, x_end, linewidth=7, colors='red', alpha=0.1)
plt.hlines(1.2, 0, 10, linewidth=7, colors='red', alpha=1)
plt.ylim(0.8, 1.4)
plt.show()

我希望y=1处直线的红色从x=0到x=1的透明度与y=1.2处水平线的透明度相同(完全不透明)。但事实并非如此


有没有办法通过matplotlib和alpha值实现我想要的?我将知道可能重叠的行的总数(即,重叠的行数应对应于0透明度)。

多亏@cphlewis为我指出了正确的方向,我现在有了一个可以满足我需要的近似值

我的问题比一般问题简单得多,因为我想为每一行(层)指定完全相同的透明度级别
s
。如果有
n=2
行,我希望两行重叠时的透明度接近0,例如
alpha=0.97

如果
n=2
alpha=0.97
,则求解

0.97 = s + s(1-s)
对于
s
而言,产生
s=0.827

将其推广到任何
n
将导致求解多项式,其中系数由第n行给出,且每个系数的符号等于

(-1)^(n + pos)
其中,
pos
是帕斯卡三角形中系数从左到右的位置,其中,
pos
从1开始。此外,帕斯卡三角形中的最后一个系数将替换为所需的
alpha

所以对于
n=5
要求解的多项式是

s^5 - 5s^4 + 10s^3 - 10s^2 + 5s - 0.97 = 0
下面的Python代码求解给定
n
alpha
(注意
alpha<1
)的最小实根(这是我想要的
alpha
值)

将numpy导入为np
进口scipy.linalg
行数=5
end_alpha_值=0.97##end_alpha_值必须在间隔(0,1)内
pascal_triangle=scipy.linalg.pascal(num_lines+1,kind='lower')
打印'num_reps:1,最小实根:%.3f'%end_alpha_值
对于范围内的i(2,num_行+1):
系数列表=[]
对于j,枚举中的系数(pascal_三角形[i][:i]):
附加(coeff*(-1)**(i+j+1)))
系数列表。追加(-end\u alpha\u值)
所有根=np.根(系数列表)
实根=所有根[np.isreal(所有根)]
最小实根=最小(实根)
real\u value=min\u real\u root.real[abs(min\u real\u root.imag)<1e-5]
打印'num_reps:%i,最小实根:%.3f'(i,实值[0])
对于
n=10
的情况,如果所需的透明度为
alpha=0.97
,则
s=0.296
产生以下输出:

我相信,使用黑色作为颜色会更好地显示正在发生的事情:

透明度为
s
d
的图层加在一起,形成透明度
s+d(1-s)
(请参阅)。对于两层alpha 0.5,很容易看出总和不是很不透明;对于所有
n
,alpha将超过
1/n
。(多项式展开似乎有点熟悉,也许根有一个技巧。)哈,看看这个:;近似于一般问题。@cphlewis谢谢,我使用了你的透明度公式和链接得出了一个对我有效的近似值(见下文)。一夜之间意识到没有半透明层的覆盖层是完全不透明的——让y%的x%的光线通过仍然是让一点光线通过。所以最小的真根,就像你说的。这是一个很好的物理直觉的例子,一个相对简单的方程的实根和复根,我打赌我会用它来教学。把更新后的图形作为一个例子?我还希望将其视为一种数据可视化策略。
import numpy as np
import scipy.linalg

num_lines = 5
end_alpha_value = 0.97  ## end_alpha_value must be in the interval (0, 1)

pascal_triangle = scipy.linalg.pascal(num_lines + 1, kind='lower')

print 'num_reps: 1, minimum real root: %.3f' % end_alpha_value
for i in range(2, num_lines + 1):
    coeff_list = []
    for j, coeff in enumerate(pascal_triangle[i][:i]):
        coeff_list.append(coeff * ((-1)**(i+j+1)))
    coeff_list.append(-end_alpha_value)

    all_roots = np.roots(coeff_list)
    real_roots = all_roots[np.isreal(all_roots)]
    min_real_root = min(real_roots)
    real_valued = min_real_root.real[abs(min_real_root.imag) < 1e-5]

    print 'num_reps: %i, minimum real root: %.3f' % (i, real_valued[0])