如何在matplotlib中生成随机颜色?
如何生成随机颜色以便传递给绘图函数的简单例子是什么呢?
我在一个循环里调用散点图函数,想让每个图的颜色都不一样。
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上都测试过,效果都很好。