matplotlib的平滑,插值三级或四级色标(例如r,g,b三角形)?

时间:2015-08-12 14:02:08

标签: python matplotlib colors color-space

假设我想为matplotlib图中的点创建颜色方案,并且每个点都有一定比例的属性ABC(每个属性都可以取值从0到1)。一个简单的方法是使用rgb triangle,因此点的红色值由A给出,其绿色值由B给出,其蓝色值由{C给出1}}。

然而,似乎像this这样的替代三角形可能会提供更多的“动态范围”,即可以更容易地看到每个点在三角形中的位置。但是,我不知道如何编码该特定三角形(即给定ABC,返回(r,g,b)元组。它还有一个额外的问题,即在中心有白色,在白色背景下看起来不太好。

我的问题:对于像这样的问题,什么是好的三角色标?什么是这种事情,因为我发现很难搜索?

此外,如果我们想将此扩展为四个属性ABCD,并且具有“颜色方块”,那么四角的适当颜色,以及如何编写一个函数来自ABCD并返回(r,g,b)元组?

理想情况下,这样的配色方案(a)在任何地方都有独特的颜色,(b)其中没有白色,(c)理想情况下具有高度变化,以便更容易看到色标中的哪个位置你是通过观察它。更好的是色盲是安全的,但在这种情况下可能要求太多。

建议非常感谢。我的最终目标是制作类似this的东西,但使用其中一种颜色方案。感谢。

编辑:添加重要约束A+B+C=1以使技术上成为可能。例如,假设我想提出一种配色方案,以便将唯一的颜色映射到ternary phase diagram such as this中的特定组合。 “明显”的情况是使用RGB三角形,但有更好的解决方案吗?我将如何在Python中编写代码?

1 个答案:

答案 0 :(得分:1)

使用类似的内容来了解​​如何表示自己的数据:

import matplotlib.pyplot as plt
from numpy import random

count = 300
space = random.random((count,2))
hue = random.uniform(0,1,(count,3))

def to_rgb(triplet):
    '''convert a triplet of values in the range [0,1]
    to a RGB triplet of values in the range [0, 255] (integers);
    blue is kept to a smaller range so the RGB never turns white.'''

    red = triplet[0]
    green = 1-triplet[1]
    blue = triplet[2]*0.75

    return [red, green, blue]


plt.scatter(space[:,0], space[:,1], c=map(to_rgb, hue), s=60)
plt.show()

您可以使用ColorBrewer讨论我们如何解释单色或发散或任何颜色方案,以弄清楚您想如何表示三个“颜色”变量中的每一个。 (很难将它们中的三个组合在一起。更难以做到这一点,即使是最常见的色盲。)