问题描述
这个问题与此有关( matplotlib-change -colormap-tab20到有三种颜色)
我想对tab10色彩图进行调整,使我可以按照自己想要的许多步骤来更改每种颜色的alpha等级.下面是一个示例(对于9种颜色和3个alpha级别),无法产生预期的输出.此外,它的通用性还不够高(由于if词缀).
I would like to tweak the tab10 colormap in a way that I can change the alpha level of each color in as many steps as I would like to. Below is an example (for 9 color with 3 alpha levels) which does not yield the expected output. Furthermore, it is not generic enough (because of the if elif staements).
有什么想法我该怎么做?
Any ideas how I could do that ?
在此示例中,我确实有3个小组和3个子小组:
In this example, I do have 3 groups with 3 subgroups:
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()
这是数据:
{'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}}
{'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
映射可用于获取一定数量的基色.从这些类别中,您可以为子类别选择一些较浅的阴影.
You may use the HSV system to obtain differently saturated and luminated colors for the same hue. Suppose you have at most 10 categories, then the tab10
map can be used to get a certain number of base colors. From those you can choose a couple of lighter shades for the subcategories.
以下将是函数categorical_cmap
,该函数将类别(nc
)和子类别(nsc
)的数量作为输入,并返回具有nc*nsc
种不同颜色的色图,每种颜色分别类别中,有nsc
种具有相同色相的颜色.
The following would be a function categorical_cmap
, which takes as input the number of categories (nc
) and the number of subcategories (nsc
) and returns a colormap with nc*nsc
different colors, where for each category there are nsc
colors of same hue.
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()
这篇关于来自tab10的matplotlib通用颜色图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!