如何在matplotlib中生成随机颜色?

时间:2013-02-06 01:55:30

标签: python matplotlib

如何为传递给绘图函数生成随机颜色的简单例子是什么?

我在循环中调用散射并希望每个绘图都有不同的颜色。

for X,Y in data:
   scatter(X, Y, c=??)
  

C:   一种颜色。 c可以是单色格式字符串,或长度为N的颜色规范序列,或使用通过kwargs指定的cmap和norm映射到颜色的N个数字序列(见下文)。请注意,c不应该是单个数字RGB或RGBA序列,因为它与要进行颜色映射的值数组无法区分。 c可以是2-D阵列,其中行是RGB或RGBA。

11 个答案:

答案 0 :(得分:99)

  

我在循环中调用散点图并希望每个绘图都有不同的颜色。

基于此,并根据您的回答:在我看来,您确实需要数据集的n 不同的颜色; 您希望将整数索引0, 1, ..., n-1映射到不同的RGB颜色。类似于:

mapping index to color

这是执行此操作的功能:

import matplotlib.pyplot as plt

def get_cmap(n, name='hsv'):
    '''Returns a function that maps each index in 0, 1, ..., n-1 to a distinct 
    RGB color; the keyword argument name must be a standard mpl colormap name.'''
    return plt.cm.get_cmap(name, n)

问题中代码段中的用法:

cmap = get_cmap(len(data))
for i, (X, Y) in enumerate(data):
   scatter(X, Y, c=cmap(i))

我使用以下代码在我的答案中生成了这个数字:

import matplotlib.pyplot as plt

def get_cmap(n, name='hsv'):
    '''Returns a function that maps each index in 0, 1, ..., n-1 to a distinct 
    RGB color; the keyword argument name must be a standard mpl colormap name.'''
    return plt.cm.get_cmap(name, n)

def main():
    N = 30
    fig=plt.figure()
    ax=fig.add_subplot(111)   
    plt.axis('scaled')
    ax.set_xlim([ 0, N])
    ax.set_ylim([-0.5, 0.5])
    cmap = get_cmap(N)
    for i in range(N):
        rect = plt.Rectangle((i, -0.5), 1, 1, facecolor=cmap(i))
        ax.add_artist(rect)
    ax.set_yticks([])
    plt.show()

if __name__=='__main__':
    main()

使用Python 2.7和& S测试matplotlib 1.5,以及Python 3.5& matplotlib 2.0。它按预期工作。

答案 1 :(得分:50)

for X,Y in data:
   scatter(X, Y, c=numpy.random.rand(3,1))

答案 2 :(得分:23)

详细阐述@ john-mee的答案,如果您有任意长的数据但不需要严格的独特颜色:

for python 2:

from itertools import cycle
cycol = cycle('bgrcmk')

for X,Y in data:
    scatter(X, Y, c=cycol.next())

for python 3:

from itertools import cycle
cycol = cycle('bgrcmk')

for X,Y in data:
    scatter(X, Y, c=next(cycol))

这样做的好处是颜色易于控制,而且颜色很短。

答案 3 :(得分:11)

少于9个数据集时:

colors = "bgrcmykw"
color_index = 0

for X,Y in data:
    scatter(X,Y, c=colors[color_index])
    color_index += 1

答案 4 :(得分:6)

这是阿里答案的更简洁版本,每个情节给出一种不同的颜色:

import matplotlib.pyplot as plt

N = len(data)
cmap = plt.cm.get_cmap("hsv", N+1)
for i in range(N):
    X,Y = data[i]
    plt.scatter(X, Y, c=cmap(i))

答案 5 :(得分:6)

由于问题是How to generate random colors in matplotlib?,并且在寻找有关pie plots的答案时,我认为有必要在此处(对于pies)给出答案

import numpy as np
from random import sample
import matplotlib.pyplot as plt
import matplotlib.colors as pltc
all_colors = [k for k,v in pltc.cnames.items()]

fracs = np.array([600, 179, 154, 139, 126, 1185])
labels = ["label1", "label2", "label3", "label4", "label5", "label6"]
explode = ((fracs == max(fracs)).astype(int) / 20).tolist()

for val in range(2):
    colors = sample(all_colors, len(fracs))
    plt.figure(figsize=(8,8))
    plt.pie(fracs, labels=labels, autopct='%1.1f%%', 
            shadow=True, explode=explode, colors=colors)
    plt.legend(labels, loc=(1.05, 0.7), shadow=True)
    plt.show()

输出

enter image description here

enter image description here

答案 6 :(得分:2)

根据Ali和Champitoad的回答:

如果你想尝试不同的调色板,你可以用几行来完成:

cmap=plt.cm.get_cmap(plt.cm.viridis,143)

^ 143是您正在采样的颜色数

我选择了143,因为色彩图上的所有颜色都在这里发挥作用。您可以做的是每次迭代采样第n种颜色以获得色彩映射效果。

n=20 for i,(x,y) in enumerate(points): plt.scatter(x,y,c=cmap(n*i))

答案 7 :(得分:1)

改进答案https://stackoverflow.com/a/14720445/6654512以使用Python3。这段代码有时会生成大于1的数字,matplotlib会抛出错误。

for X,Y in data:
   scatter(X, Y, c=numpy.random.random(3))

答案 8 :(得分:0)

with test as (
    select '<?xml version="1.0" encoding="UTF-8"?><Attachment content-type="application/ms-excel" name="123_PQ_ABCDEFG_160720190439.tmp"/>' code from dual
)
select code,
 SUBSTR(code,instr(code,'name="')+6,3) code
from test

答案 9 :(得分:0)

如果要确保颜色不同-但不知道需要多少种颜色。尝试这样的事情。它从光谱的相反两侧选择颜色,并系统地增加粒度。

import math

def calc(val, max = 16):
    if val < 1:
        return 0
    if val == 1:
        return max

    l = math.floor(math.log2(val-1))    #level 
    d = max/2**(l+1)                    #devision
    n = val-2**l                        #node
    return d*(2*n-1)
import matplotlib.pyplot as plt

N = 16
cmap = cmap = plt.cm.get_cmap('gist_rainbow', N)

fig, axs = plt.subplots(2)
for ax in axs:
    ax.set_xlim([ 0, N])
    ax.set_ylim([-0.5, 0.5])
    ax.set_yticks([])

for i in range(0,N+1):
    v = int(calc(i, max = N))
    rect0 = plt.Rectangle((i, -0.5), 1, 1, facecolor=cmap(i))
    rect1 = plt.Rectangle((i, -0.5), 1, 1, facecolor=cmap(v))
    axs[0].add_artist(rect0)
    axs[1].add_artist(rect1)

plt.xticks(range(0, N), [int(calc(i, N)) for i in range(0, N)])
plt.show()

output

感谢@Ali提供了基本实现。

答案 10 :(得分:0)

可重现的结果

# generate random colors
colors_ = lambda n: list(map(lambda i: "#" + "%06x" % random.randint(0, 0xFFFFFF),range(n)))

fig = plt.figure()
fig.subplots_adjust(hspace=0.4, wspace=0.4)

# how many random colors to generate?
colors = colors_(6)
for i,color in zip(range(1, 7), colors):
    ax = fig.add_subplot(2, 3, i)
    ax.text(0.5, 0.5, str((2, 3, i)),
           fontsize=18, ha='center', color=color)

输出