我使用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()
我希望y = 1处的线从x = 0到x = 1的红色透明度与y = 1.2处的水平线的透明度相同(根本不透明)。但事实并非如此。
有没有办法用matplotlib和alpha值实现我想要的?我将知道可能重叠的总行数(即重叠的行数应对应于0透明度)。
答案 0 :(得分:2)
感谢@cphlewis让我指出了正确的方向,我现在有了一个适合我需要的近似值。
我的问题比一般问题容易得多,因为我想为每一行(图层)分配完全相同的透明度级别s
。如果有n=2
行我希望两条线重叠时的透明度接近0,例如alpha=0.97
。
如果n=2
和alpha=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
会产生以下输出:
我相信正在发生的事情会更好地使用黑色作为颜色: