假设我想为matplotlib图中的点创建颜色方案,并且每个点都有一定比例的属性A
,B
和C
(每个属性都可以取值从0到1)。一个简单的方法是使用rgb triangle,因此点的红色值由A
给出,其绿色值由B
给出,其蓝色值由{C
给出1}}。
然而,似乎像this这样的替代三角形可能会提供更多的“动态范围”,即可以更容易地看到每个点在三角形中的位置。但是,我不知道如何编码该特定三角形(即给定A
,B
和C
,返回(r,g,b)
元组。它还有一个额外的问题,即在中心有白色,在白色背景下看起来不太好。
我的问题:对于像这样的问题,什么是好的三角色标?什么是这种事情,因为我发现很难搜索?
此外,如果我们想将此扩展为四个属性A
,B
,C
和D
,并且具有“颜色方块”,那么四角的适当颜色,以及如何编写一个函数来自A
,B
,C
和D
并返回(r,g,b)
元组?
理想情况下,这样的配色方案(a)在任何地方都有独特的颜色,(b)其中没有白色,(c)理想情况下具有高度变化,以便更容易看到色标中的哪个位置你是通过观察它。更好的是色盲是安全的,但在这种情况下可能要求太多。
建议非常感谢。我的最终目标是制作类似this的东西,但使用其中一种颜色方案。感谢。
编辑:添加重要约束A+B+C=1
以使技术上成为可能。例如,假设我想提出一种配色方案,以便将唯一的颜色映射到ternary phase diagram such as this中的特定组合。 “明显”的情况是使用RGB三角形,但有更好的解决方案吗?我将如何在Python中编写代码?
答案 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讨论我们如何解释单色或发散或任何颜色方案,以弄清楚您想如何表示三个“颜色”变量中的每一个。 (很难将它们中的三个组合在一起。更难以做到这一点,即使是最常见的色盲。)