我遇到了一个问题,我怀疑它与解析器中的替换顺序有关。
从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颜色值?似乎它应该是一个简单的问题,恰好是正确的句法形式 - 但我还没能猜出那是什么。
我绝对不会做的一件事!!!想要最终要做的是使用浮点元组的“替代”方法,来自文档:
或者你可以传递R,G,B元组,其中R,G,B中的每一个都在 范围[0,1]。
,因为:
1)浮点值总是近似值,因此映射到一个完整的RGB色彩空间,如果你的计算轮次很差,有可能得到一个不精确的颜色 - 不是你选择的那个(或希望)选择)
2)颜色规范的十六进制三元组方法对我来说至少是非常直观和明显的。虽然很容易想到它们如何映射到0-1色彩空间,但我宁愿不必采用那种方法,因为它意味着我脑子里的“翻译” - 以及代码中的“翻译”。 d必须这样做,例如green = hex_green / 0x100(或者确实是正确的?)[0,1]空间实际上是否映射为[0,1) - 因此十六进制255比映射到名义浮点数1少一个,或者它们是否映射在0-255的空间映射中,0,1作为闭合范围[0,1]上的真正256个值,因此1 = 255等等?因此,映射不直观,实际上有些含糊不清。
因此,除非确实没有选项,否则如果要使用计算替换,则使用三元组形式,如果确实是命令解析器的低级设计不允许除文本文字之外的任何选项,如果你想使用html颜色规范,我宁愿不使用这样的解决方案提供“解决方案”。但无论如何,如果这是唯一可以完成的方式,请告诉我。
感谢。
答案 0 :(得分:1)
问题似乎在一开始就缺少零。 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
也可以。