如何为传递给绘图函数生成随机颜色的简单例子是什么?
我在循环中调用散射并希望每个绘图都有不同的颜色。
for X,Y in data:
scatter(X, Y, c=??)
C: 一种颜色。 c可以是单色格式字符串,或长度为N的颜色规范序列,或使用通过kwargs指定的cmap和norm映射到颜色的N个数字序列(见下文)。请注意,c不应该是单个数字RGB或RGBA序列,因为它与要进行颜色映射的值数组无法区分。 c可以是2-D阵列,其中行是RGB或RGBA。
答案 0 :(得分:99)
我在循环中调用散点图并希望每个绘图都有不同的颜色。
基于此,并根据您的回答:在我看来,您确实需要数据集的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和& 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()
输出
答案 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()
感谢@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)
输出