我希望能够在白色背景上以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')

python - 在matplotlib中的白色背景上计算alpha值为0.5的基色的RGB等效值-LMLPHP

最佳答案

编辑:您可以使用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)

python - 在matplotlib中的白色背景上计算alpha值为0.5的基色的RGB等效值-LMLPHP

10-06 01:55