matplotlib的alpha透明度值是否可以“求和”为1?

时间:2015-03-09 15:57:33

标签: python-2.7 matplotlib alpha

我使用matplotlib绘制一系列重叠的水平线。我想(通过非常粗略的方式)表明通过透明度有多少重叠。例如,如果我有十行,其中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()

Image of two lines with different transparencies

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

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

1 个答案:

答案 0 :(得分:2)

感谢@cphlewis让我指出了正确的方向,我现在有了一个适合我需要的近似值。

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

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

0.97 = s + s(1-s)

s会产生s=0.827

对任何n推广这导致求解多项式,其中系数由Pascal's triangle的第n行给出,并且每个系数的符号等于

(-1)^(n + pos)

其中pos是从左到右的Pascal三角形中系数的位置,pos从1开始。此外,Pascal三角形中的最后一个系数被替换为所需的{{1} }值。

因此,对于alpha,要求解的多项式是

n=5

以下Python代码解决了给定s^5 - 5s^4 + 10s^3 - 10s^2 + 5s - 0.97 = 0 alpha的最小实根(我想要的n值)(注意alpha)。< / p>

alpha < 1

对于案例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]) ,如果所需的透明度为n=10,则alpha=0.97会产生以下输出: Imgur

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