我希望能够在白色背景上以0.5的alpha值在matplotlib中复制原色('r','g'或'b')的外观,同时将alpha值保持为1。
这是下面的示例,通过手动实验,我发现了alpha值为1的RGB值,看起来与alpha值为0.5的matplotlib默认颜色相似。
我想知道是否有人有自动化的方法来实现这一目标。
import matplotlib.pyplot as plt
s=1000
plt.xlim([4,8])
plt.ylim([0,10])
red=(1,0.55,0.55)
blue=(0.55,0.55,1)
green=(0.54,0.77,0.56)
plt.scatter([5],[5],c='r',edgecolors='none',s=s,alpha=0.5,marker='s')
plt.scatter([6],[5],c='b',edgecolors='none',s=s,alpha=0.5,marker='s')
plt.scatter([7],[5],c='g',edgecolors='none',s=s,alpha=0.5,marker='s')
plt.scatter([5],[5.915],c=red,edgecolors='none',s=s,marker='s')
plt.scatter([6],[5.915],c=blue,edgecolors='none',s=s,marker='s')
plt.scatter([7],[5.915],c=green,edgecolors='none',s=s,marker='s')
最佳答案
编辑:您可以使用this answer中的公式
转换为Python,如下所示:
def make_rgb_transparent(rgb, bg_rgb, alpha):
return [alpha * c1 + (1 - alpha) * c2
for (c1, c2) in zip(rgb, bg_rgb)]
因此,您可以执行以下操作:
red = [1, 0, 0]
white = [1, 1, 1]
alpha = 0.5
make_rgb_transparent(red, white, alpha)
# [1.0, 0.5, 0.5]
现在使用此功能,我们可以创建一个确认此工作的绘图:
from matplotlib import colors
import matplotlib.pyplot as plt
alpha = 0.5
kwargs = dict(edgecolors='none', s=3900, marker='s')
for i, color in enumerate(['red', 'blue', 'green']):
rgb = colors.colorConverter.to_rgb(color)
rgb_new = make_rgb_transparent(rgb, (1, 1, 1), alpha)
print(color, rgb, rgb_new)
plt.scatter([i], [0], color=color, **kwargs)
plt.scatter([i], [1], color=color, alpha=alpha, **kwargs)
plt.scatter([i], [2], color=rgb_new, **kwargs)