【问题标题】:Color handling in PythonPython中的颜色处理
【发布时间】:2011-04-12 15:41:53
【问题描述】:

对于我的集群 gui,我目前正在为集群使用随机颜色,因为我事先不知道最终会得到多少个集群。

在 Python 中,这看起来像:

import random
def randomColor():
    return (random.random(),random.random(),random.random())

但是,当我更新内容时,颜色会发生变化。

所以我更喜欢有一个函数,它有一个输入参数,比如

def nonrandomColor(i):
   ...
   return color

总是会为相同的 I 返回相同的颜色,同时保持生成任意多种颜色的能力。

答案不必用 Python 制定,它更像是我感兴趣的一般布局。

【问题讨论】:

标签: python colors


【解决方案1】:

一种方法是使用缓存。使用defaultdict:

>>> import random
>>> def randomColor():
...    return (random.random(),random.random(),random.random())
... 
>>> from collections import defaultdict
>>> colors = defaultdict(randomColor)
>>> colors[3]
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264)
>>> colors[1]
(0.48991106537516382, 0.77039712435566876, 0.73707003166893892)
>>> colors[3]
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264)

【讨论】:

  • 将 dict 的前几个条目预先设置为易于区分的颜色(红色、黄色、绿色、蓝色)将减少生成带有蓝色、蓝色、蓝色和蓝色线条的图形的机会.
  • @Jason:你的想法很有用。颜色为各种深浅不一的蓝色的风险并不高,但将前几种颜色设为静态也可以使图表更易于理解。
【解决方案2】:

只需将随机生成器的seed 设置为索引,这可能比存储颜色便宜。

random.seed(i)

请注意,这会使随机数方式比以前更不随机。如果这是一个问题,例如如果您的应用程序在其他地方使用随机数,您可能需要查看其他答案建议的缓存选项。

【讨论】:

  • -1 因为频繁设置随机种子会导致随机数生成器高度非随机。如果您的程序还使用随机数来做其他事情,这将是一个坏主意。
  • 避免弄乱随机数生成器的一种方法是使用专门的颜色生成器。 color_rnd = random.Random(); color_rnd.seed(i)
【解决方案3】:

如果你想要可重复的非碰撞颜色,那么你可以使用类似下面的函数。它将数字分成 1、10、100,然后将它们用作颜色的 RGB 部分。

def color(i):
  r = i % 10
  g = (i//10) % 10
  b = (i//100) % 10
  return(r*25, g*25, b*25)

例如:

color(1) == (25,0,0)
color(10) == (0,25,0)
color(999) = (225,225,255)

【讨论】:

    【解决方案4】:

    您想将颜色存储在字典或列表中:

    colors = {} # int -> color
    def nonrandomColor(i):
       if i not in colors:
          colors[i] = randomColor()
       return colors[i] 
    

    【讨论】:

      【解决方案5】:

      您可以使用i 为随机数生成器播种。因此,只要种子保持不变,您就会得到相同的值。

      >>> import random
      >>> random.seed(12)
      >>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
      (121, 168, 170)
      >>> random.seed(12)
      >>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
      (121, 168, 170)
      >>> random.seed(10)
      >>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
      (146, 109, 147)
      >>> random.seed(10)
      >>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
      (146, 109, 147)
      

      根据您可能生成的颜色数量(即 10 种或 100 万种),缓存方法可能比 seed() 方法更好。

      【讨论】:

      • 尽可能不要乱用全局种子!创建您自己的 random.Random 对象并设置其种子。
      猜你喜欢
      • 2012-12-23
      • 2013-02-22
      • 1970-01-01
      • 2011-02-07
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      相关资源
      最近更新 更多