将任意长度的元组映射到RGB值

时间:2014-05-10 23:57:41

标签: python

我需要将任意(但相同)长度的元组(整数)计算为RGB值。如果我可以让它们按照数量级或多或少的顺序排列,那么在(0,1)和(1,0)之间选择子顺序的任何标准方法都会特别好。

以下是我现在的表现:

  1. 我有很长的RGB颜色值列表。

    colors = [(0,0,0),(255,255,255),...]
    
  2. 我把元组的哈希值改为颜色数,并用它作为索引。

    def tuple_to_rgb(atuple):
        index = hash(atuple) % len(colors)
        return colors[index]
    
  3. 这样可行,但我希望它更像是热图值,其中(5,5,5)的值大于(0,0,0),因此相邻的颜色有一定意义,随着价值变大,可能变得“更热”。

    我知道如何map integers onto RGB values,所以也许我只是从一个元组生成一个唯一的整数,它首先按元组的大小排序,然后按内部值排序,它可能有效。 / p>

    我可以简单地编写自己的排序比较器,提前生成可能元组的整个列表,并使用列表中的顺序作为唯一整数,但如果我不必生成所有的整数,那将会容易得多。提前可能的元组。

    有没有人有任何建议?这似乎是可以做到的事情,我很感激有任何提示让我朝着正确的方向前进。

    对于那些感兴趣的人,我试图想象量子点的电子占据的预测,如this paper的图1b中的那些,但具有任意数量的点(因而是任意的元组长度)。元组长度在代码的给定应用程序中是固定的,但我不希望代码特定于双点或三点。可能不会比四重点大得多,但实验主义者梦想着一些非常狂野的系统。

2 个答案:

答案 0 :(得分:0)

这是我提出的代码:

class Colormapper:
    """
    Create a colormap to map tuples onto RGBA values produced by matplolib's
    cmap function.

    Arguments are the maximum value of each place in the tuple. Dimension of
    the tuple is inferred from the length of the args array.
    """
    def __init__(self,*args):
        from itertools import product
        import matplotlib.pyplot as plt

        self.occs = sorted(list(product(*[xrange(arg+1) for arg in args])),key=sum)
        self.n = float(len(self.occs))
        self.hotmap = plt.get_cmap('hot')
        return

    def __call__(self,occ):
        ind255 = int(255*self.occs.index(occ)/self.n)
        return self.hotmap(ind255)

以下是此代码结果的示例:

double dot stability diagram

答案 1 :(得分:0)

这是另一种方法。由于到目前为止我生成的点只有可能占用的子集,因此颜色图在某种程度上是偏斜的,并且看起来不那么好。此方法需要传入可能的状态列表,因此必须事先生成这些状态,但生成的颜色映射看起来更好。

class Colormapper2:
    """
    Like Colormapper, but uses a list of possible occupations to
    generate the maps, rather than generating all possible occupations.
    The difference is that the systems I've explored only have a subset
    of the possible states occupied, and the colormaps look better 
    this way.
    """
    def __init__(self,occs,**kwargs):
        import matplotlib.pyplot as plt
        colormap = kwargs.get('colormap','hot')
        self.occs = sorted(list(occs),key=sum)
        self.n = float(len(self.occs))
        self.cmap = plt.get_cmap(colormap)
        return

    def __call__(self,occ):
        ind255 = int(255*self.occs.index(occ)/self.n)
        return self.cmap(ind255)

以下是生成图像的示例:

double dot stability diagram

您可以看到颜色比其他版本更好地分开。