Skip to main content
 首页 » 编程设计

python之Matplotlib(pylab): how to specify a substituted html colour code for plotting

2025年05月04日9hnrainll

我遇到了一个问题,我怀疑它与解析器中的替换顺序有关。

在 matplotlib 文档中,它有:

“对于更大范围的颜色,您有两种选择。您可以使用 html 十六进制字符串指定颜色,如下所示:

color = '#eeefff'"

我喜欢这种方法,因为它为我提供了(对我而言)易于理解的颜色值 - 因此很容易以编程方式将颜色设置为我想要实现的颜色选择。所以,我有一段代码,例如,在越来越亮的绿色值之间循环(或者至少这是我希望它实现的):

for t in range(runtime): 
 
... 
 
 green = 0x008000 
    if t < 32: 
       x_vals = [x for line in film.frames[t] for x in range(len(line)) if line[x] > 0] 
       y_vals = [y for y in range(len(film.frames[t])) for x in film.frames[t][y] if x > 0] 
       if len(y_vals) > 0: 
          pylab.scatter(x_vals, y_vals, color=('#%x' % green), s=8, marker='s') 
       green += 0x400 
       if green > 0x00FF00: green = 0x00FF00 

...除了这行不通。我得到的是:

ValueError: to_rgba: Invalid rgba arg "#" 
to_rgb: Invalid rgb arg "#" 
invalid hex color string "#" 

正如我所提到的,这看起来像是那些神秘的替换顺序问题之一,因为如果我输入文字

pylab.scatter(x_vals, y_vals, color='#008000, s=8, marker='s') 

事情似乎奏效了。

那么如何将替换的 html 颜色值输入到 plot 函数中呢?似乎这应该是一个简单的正确句法形式的问题 - 但我还不能猜出那是什么。

有一件事我绝对不会!!!想要最终不得不做的是使用文档中的浮点元组的“替代”方法:

or you can pass an R , G , B tuple, where each of R , G , B are in the range [0,1].

因为:

1) 浮点值始终是某种近似值,因此映射到完整的 RGB 颜色空间中,如果您的计算方式不佳,则有可能获得不精确的颜色 - 与您选择的(或希望的)不完全相同选择)

2) 颜色规范的十六进制三元组方法至少对我来说非常直观和明显。虽然考虑如何将它们映射到 0-1 颜色空间很容易,但我宁愿不必诉诸这种方法,因为它意味着我头脑中的“翻译”——以及代码中的——你d 必须做,例如green = hex_green/0x100(或者确实是这样吗?)[0,1] 空间是否实际映射为 [0,1) - 因此十六进制 255 比映射到名义 float 1 的值少一个,或者它们是否映射0,1 在从 0-255 的空间映射中作为闭合范围 [0,1] 上真正的 256 个值,因此 1=255 等等?因此映射并不直观,实际上有些模棱两可。

所以除非真的没有选择,如果你想使用计算替换,只能使用三元组形式,如果真的是命令解析器的低级设计允许除了文本文字之外没有其他选择,如果您想使用 html 颜色规范,我宁愿不使用这种解决方法提供“解决方案”。但无论如何,如果这是唯一可以做到的方法,请告诉我。

谢谢。

请您参考如下方法:

问题似乎在开始时缺少零。 Python 删除了对数值不重要的零。

'{0:06x}'.format(green) 使用它使其始终用零填充到 6 位长度。

In [221]: '{0:x}'.format(green) 
Out[221]: '8000' 
 
In [222]: '{0:06x}'.format(green) 
Out[222]: '008000' 
如果您想使用此语法,

'%06.x' %green 也适用。