gpt4 book ai didi

python - 来自 tab10 的 matplotlib 通用颜色图

转载 作者:太空狗 更新时间:2023-10-29 22:07:27 63 4
gpt4 key购买 nike

这个问题与来自 SO ( matplotlib-change-colormap-tab20-to-have-three-colors ) 的这个问题相关

我想调整 tab10 颜色图,以便我可以根据需要按任意多的步骤更改每种颜色的 alpha 级别。下面是一个示例(对于 9 种颜色和 3 个 alpha 级别),它没有产生预期的输出。此外,它不够通用(因为 if elif 语句)。

有什么想法可以做到吗?

在这个例子中,我有 3 个组和 3 个子组:

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

n_feature = 3
sub_feature = 3
col = []
for index in range(n_feature*sub_feature):
# loop over colors and change the last entry in descending order 3 times
col.append(list(plt.cm.tab10(index)))

i = 0
for item in col:
# loop over colors and change the last entry in descending order 3 times
if i == 0:
item[-1] = 0.9
i+=1
elif i == 1:
item[-1] = 0.7
i+=1
elif i == 2:
item[-1] = 0.5
i = 0

gr = df.groupby(['a', 'a1'])

for index, item in enumerate(gr):
name, val = item
y = val.iloc[0,2:].values
x = np.arange(len(y))
plt.plot(x, y, '.-', color=col[index])

plt.show()

enter image description here

这是数据:

{'a': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B', 5: 'B', 6: 'C' , 7: 'C', 8: 'C'}, 'a1': {0: 1, 1: 2, 2: 3, 3: 1, 4: 2, 5: 3, 6: 1, 7: 2, 8: 3}, 'b':{0:1.0, 1:5.0, 2:9.0, 3:1.5, 4:5.5, 5:9.5, 6:1.75, 7:5.75, 8: 9.75}, 'c':{0:2.0, 1:6.0, 2:10.0, 3:2.5, 4:6.5, 5:10.5, 6:2.75, 7:6.75, 8: 10.75}, 'd':{0:3.0, 1:7.0, 2:11.0, 3:3.5, 4:7.5, 5:11.5, 6:3.75, 7:7.75, 8: 11.75}, 'e':{0:4.0, 1:8.0, 2:12.0, 3:4.5, 4:8.5, 5:12.5, 6:4.75, 7:8.75, 8: 12.75}

最佳答案

您可以使用 HSV 系统获得相同色调的不同饱和度和亮度的颜色。假设你最多有 10 个类别,那么可以使用 tab10 映射来获取一定数量的基色。您可以从中为子类别选择几个较浅的色调。

下面是一个函数 categorical_cmap,它将类别数 (nc) 和子类别数 (nsc) 作为输入) 并返回具有 nc*nsc 不同颜色的颜色图,其中每个类别都有相同色调的 nsc 颜色。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

def categorical_cmap(nc, nsc, cmap="tab10", continuous=False):
if nc > plt.get_cmap(cmap).N:
raise ValueError("Too many categories for colormap.")
if continuous:
ccolors = plt.get_cmap(cmap)(np.linspace(0,1,nc))
else:
ccolors = plt.get_cmap(cmap)(np.arange(nc, dtype=int))
cols = np.zeros((nc*nsc, 3))
for i, c in enumerate(ccolors):
chsv = matplotlib.colors.rgb_to_hsv(c[:3])
arhsv = np.tile(chsv,nsc).reshape(nsc,3)
arhsv[:,1] = np.linspace(chsv[1],0.25,nsc)
arhsv[:,2] = np.linspace(chsv[2],1,nsc)
rgb = matplotlib.colors.hsv_to_rgb(arhsv)
cols[i*nsc:(i+1)*nsc,:] = rgb
cmap = matplotlib.colors.ListedColormap(cols)
return cmap

c1 = categorical_cmap(4, 3, cmap="tab10")
plt.scatter(np.arange(4*3),np.ones(4*3)+1, c=np.arange(4*3), s=180, cmap=c1)

c2 = categorical_cmap(2, 5, cmap="tab10")
plt.scatter(np.arange(10),np.ones(10), c=np.arange(10), s=180, cmap=c2)

c3 = categorical_cmap(5, 4, cmap="tab10")
plt.scatter(np.arange(20),np.ones(20)-1, c=np.arange(20), s=180, cmap=c3)

plt.margins(y=0.3)
plt.xticks([])
plt.yticks([0,1,2],["(5, 4)", "(2, 5)", "(4, 3)"])
plt.show()

enter image description here

关于python - 来自 tab10 的 matplotlib 通用颜色图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47222585/

63 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com