python:连续颜色分级

python:连续颜色分级,python,colors,Python,Colors,我有一个从负值到正值的浮点值列表。可以随意使用np.random.normal(0,1,1000)随机生成样本输入(平均值0和标准偏差1的正态分布的随机数)。我想把这个数字数组映射到红色和蓝色的分色条上,这样最小的数字是最深的蓝色(假设为#053061),最大的数字是最深的红色(假设为#b2182b) 我看了一个,接近我的问题,实际上是一个答案。但是,答案需要生成一个长度为500的数组,该数组在开始和结束颜色之间线性映射,然后我必须将原始输入数据存储到该颜色数组中。肯定有一些预先构建的功能已经做

我有一个从负值到正值的浮点值列表。可以随意使用
np.random.normal(0,1,1000)
随机生成样本输入(平均值0和标准偏差1的正态分布的随机数)。我想把这个数字数组映射到红色和蓝色的分色条上,这样最小的数字是最深的蓝色(假设为#053061),最大的数字是最深的红色(假设为#b2182b)


我看了一个,接近我的问题,实际上是一个答案。但是,答案需要生成一个长度为500的数组,该数组在开始和结束颜色之间线性映射,然后我必须将原始输入数据存储到该
颜色数组中。肯定有一些预先构建的功能已经做到了这一点?我可能在什么地方漏掉了一些文件

在您发布的问题中,user@zelupp对最高答案发表了评论,并提供了一个链接,指向一个名为Ben Southgate的人的页面

它有一堆关于在颜色之间绘制的信息,我想这页代码涵盖了你的问题?我想你应该使用线性梯度()来为你列出这个列表。ColorBrewer链接看起来像是渐变在到达另一种颜色的过程中穿过白色,因此您可以只制作两个渐变。我在一个标准化上下了很大的功夫,使颜色渐变的索引范围从

def十六进制到RGB(十六进制):
“FFFFFF”->[255255255]”
#将16传递给整数函数以更改基数
范围(1,6,2)内的i返回[int(十六进制[i:i+2],16)]
def RGB_至_十六进制(RGB):
“[255255255]->”#FFFFFF“”
#组件必须是整数,十六进制才有意义
RGB=[int(x)表示RGB中的x]
返回“#”+”.join([“0{0:x})。如果v<16,则格式化(v)
“{0:x}”。RGB中v的格式(v)])
def颜色(渐变):
''接收RGB子列表的列表并返回
用于图形功能的RGB和十六进制形式的颜色
稍后在“”上定义
返回{“hex”:[RGB_to_hex(RGB)表示梯度中的RGB],
“r”:[RGB[0]表示渐变中的RGB],
“g”:[RGB[1]表示梯度中的RGB],
“b”:[RGB[2]表示渐变中的RGB]}
def线性梯度(开始六角,结束六角=“#FFFFFF”,n=10):
''返回一个(n)种颜色之间的渐变列表
两种十六进制颜色。开始和结束
应为完整的六位彩色字符串,
包括数字符号(“FFFFFF”)“”
#RGB格式中的起始颜色和结束颜色
s=十六进制到RGB(开始十六进制)
f=六角到RGB(完成六角)
#使用起始颜色初始化输出颜色列表
RGB_列表=[s]
#在t的每个均匀间隔值(从1到n)处计算颜色
对于范围(1,n)内的t:
#在t的当前值处插值颜色的RGB向量
当前向量=[
int(s[j]+(float(t)/(n-1))*(f[j]-s[j]))
对于范围(3)内的j
]
#将其添加到我们的输出颜色列表中
RGB_列表。追加(当前向量)
返回颜色(RGB列表)
梯度1=线性梯度(“#053061”,“#FFFFFF”,n=500):
梯度2=线性梯度(“FFFFFF”),“b2182b”,n=500):
输入=np.随机.正常(0,1,1000)
旧_min=min(输入)
旧_范围=最大值(输入)-旧_最小值
新_min=0
新的\u范围=999+0.999999999-新的\u最小值
可索引=[输入中n的int((n-old_min)/old_range*new_range+new_min)]
对于可转位的n:
如果n<500:
梯度1[n]
其他:
梯度2[n]

也许是这样的

在你发布的问题中,user@zelupp对最高的答案发表了评论,并提供了一个链接,指向一个名为Ben Southgate的人的页面

它有一堆关于在颜色之间绘制的信息,我想这页代码涵盖了你的问题?我想你应该使用线性梯度()来为你列出这个列表。ColorBrewer链接看起来像是渐变在到达另一种颜色的过程中穿过白色,因此您可以只制作两个渐变。我在一个标准化上下了很大的功夫,使颜色渐变的索引范围从

def十六进制到RGB(十六进制):
“FFFFFF”->[255255255]”
#将16传递给整数函数以更改基数
范围(1,6,2)内的i返回[int(十六进制[i:i+2],16)]
def RGB_至_十六进制(RGB):
“[255255255]->”#FFFFFF“”
#组件必须是整数,十六进制才有意义
RGB=[int(x)表示RGB中的x]
返回“#”+”.join([“0{0:x})。如果v<16,则格式化(v)
“{0:x}”。RGB中v的格式(v)])
def颜色(渐变):
''接收RGB子列表的列表并返回
用于图形功能的RGB和十六进制形式的颜色
稍后在“”上定义
返回{“hex”:[RGB_to_hex(RGB)表示梯度中的RGB],
“r”:[RGB[0]表示渐变中的RGB],
“g”:[RGB[1]表示梯度中的RGB],
“b”:[RGB[2]表示渐变中的RGB]}
def线性梯度(开始六角,结束六角=“#FFFFFF”,n=10):
''返回一个(n)种颜色之间的渐变列表
两种十六进制颜色。开始和结束
应为完整的六位彩色字符串,
包括数字符号(“FFFFFF”)“”
#RGB格式中的起始颜色和结束颜色
s=十六进制到RGB(开始十六进制)
f=六角到RGB(完成六角)
#使用起始颜色初始化输出颜色列表
RGB_列表=[s]
#在t的每个均匀间隔值(从1到n)处计算颜色
对于范围(1,n)内的t:
#在t的当前值处插值颜色的RGB向量
当前向量=[
int(s[j]+(float(t)/(n-1))*(f[j]-s[j]))
对于范围(3)内的j
]
#将其添加到我们的输出颜色列表中
RGB_列表。追加(当前向量)
返回颜色(RGB列表)
梯度1=线性梯度(“#053061”,“#FFFFFF”,n=500):
梯度2=线性梯度(“FFFFFF”),“b2182b”,n=500):
输入=np.随机.正常(0,1,1000)
旧_min=min(输入)
旧_范围=最大值(输入)-旧_最小值
新_min=0
新的\u范围=999+0.999999999-新的\u最小值
可索引=[输入中n的int((n-old_min)/old_range*new_range+new_min)]
对于可转位的n:
如果n<50
def hex_to_RGB(hex):
  ''' "#FFFFFF" -> [255,255,255] '''
  # Pass 16 to the integer function for change of base
  return [int(hex[i:i+2], 16) for i in range(1,6,2)]

def RGB_to_hex(RGB):
  ''' [255,255,255] -> "#FFFFFF" '''
  # Components need to be integers for hex to make sense
  RGB = [int(x) for x in RGB]
  return "#"+"".join(["0{0:x}".format(v) if v < 16 else
            "{0:x}".format(v) for v in RGB])

def color_dict(gradient):
  ''' Takes in a list of RGB sub-lists and returns dictionary of
    colors in RGB and hex form for use in a graphing function
    defined later on '''
  return {"hex":[RGB_to_hex(RGB) for RGB in gradient],
      "r":[RGB[0] for RGB in gradient],
      "g":[RGB[1] for RGB in gradient],
      "b":[RGB[2] for RGB in gradient]}

def linear_gradient(start_hex, finish_hex="#FFFFFF", n=10):
  ''' returns a gradient list of (n) colors between
    two hex colors. start_hex and finish_hex
    should be the full six-digit color string,
    inlcuding the number sign ("#FFFFFF") '''
  # Starting and ending colors in RGB form
  s = hex_to_RGB(start_hex)
  f = hex_to_RGB(finish_hex)
  # Initilize a list of the output colors with the starting color
  RGB_list = [s]
  # Calcuate a color at each evenly spaced value of t from 1 to n
  for t in range(1, n):
    # Interpolate RGB vector for color at the current value of t
    curr_vector = [
      int(s[j] + (float(t)/(n-1))*(f[j]-s[j]))
      for j in range(3)
    ]
    # Add it to our list of output colors
    RGB_list.append(curr_vector)

  return color_dict(RGB_list)

gradient1 = linear_gradient("#053061", "#FFFFFF", n=500):
gradient2 = linear_gradient("#FFFFFF", "#b2182b", n=500):

input = np.random.normal(0, 1, 1000)
old_min = min(input)
old_range = max(input) - old_min
new_min = 0
new_range = 999 + 0.9999999999 - new_min
indexable = [int((n - old_min) / old_range * new_range + new_min) for n in input]

for n in indexable:
    if n < 500:
        gradient1[n]
    else:
        gradient2[n]