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

122 投票
12 回答
228821 浏览
提问于 2025-04-17 14:54

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

我在一个循环里调用散点图函数,想让每个图的颜色都不一样。

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

c: 颜色。c可以是一个单一的颜色格式字符串,也可以是长度为N的颜色规格序列,或者是N个数字的序列,这些数字会根据通过kwargs指定的cmap和norm映射到颜色上(见下文)。需要注意的是,c不能是单一的数值RGB或RGBA序列,因为这和要进行颜色映射的数值数组是无法区分的。不过,c可以是一个二维数组,其中的行是RGB或RGBA。

12 个回答

44

进一步解释一下@john-mee的回答,如果你有很长的数据,但不需要每种颜色都严格唯一的话:

对于Python 2:

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

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

对于Python 3:

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

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

这样做的好处是颜色很容易控制,而且代码比较简短。

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

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。

193

我在一个循环里调用scatter,想让每个图的颜色都不一样。

根据这个,还有你的回答:看起来你其实是想要n不同的颜色来表示你的数据集;你想把整数索引0, 1, ..., n-1映射到不同的RGB颜色上。 就像下面这样:

索引与颜色的映射

这是实现这个功能的函数:

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和matplotlib 1.5,以及Python 3.5和matplotlib 2.0上都测试过,效果都很好。

撰写回答