Изменение цветов на графике

Имеется следующий график:

df = pd.DataFrame({'segment': ["X", "Y", "Z", "W"], 'scores': [0.1, 0.3, 0.7, 0.9]})
ax = df.plot.barh(x='segment', y='scores')

График

Необходимо к нему применить такие цвета:

fig, ax = plt.subplots(figsize=(6, 1))
fig.subplots_adjust(bottom=0.5)

cmap = (mpl.colors.ListedColormap(['#A52A2A', '#E50000', '#FFA500', '#FFFF00', '#00FF00']))

bounds = [0, 0.2, 0.4, 0.6, 0.8, 1]
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
fig.colorbar(
    mpl.cm.ScalarMappable(cmap=cmap, norm=norm),
    cax=ax,
    boundaries=[0] + bounds + [13],  # Adding values for extensions.
    extend='both',
    ticks=bounds,
    spacing='proportional',
    orientation='horizontal',
    label='Discrete intervals, some other units',
)

Кастомные цвета для графика

Подскажите, как можно это сделать?

Спасибо!


Ответы (1 шт):

Автор решения: ganz

Суть следующего решения в том, что каждый бар создаётся особо со своим цветом

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'segment': ["X", "Y", "Z", "W"], 'scores': [0.1, 0.3, 0.7, 0.9]})


colorN=['#A52A2A', '#E50000', '#FFA500', '#FFFF00', '#00FF00','#000000']
colorV = [0, 0.2, 0.4, 0.6, 0.8, 1] #must be sorted and size as colorN
ax = plt.gca()
ax.cla()



for it in df.iterrows():
    seg=it[1].values[0]
    val=it[1].values[1]
    for num,colV in enumerate(colorV,0):
        if colV>=val:
            print(num,colV)
            col=colorN[num]
            break
    ax.barh([seg],[val],color=col)

plt.show()

введите сюда описание изображения Но вероятно следующий код будет более хорошим: все вычисленые значения цвета помещаются в список и затем выводятся

segs=[]
vals=[]
cols=[]
for it in df.iterrows():
    segs.append(it[1].values[0])
    vals.append(it[1].values[1])
    val=it[1].values[1]
    for num,colV in enumerate(colorV,0):
        if colV>=val:
            cols.append(colorN[num])
            break
ax.barh(segs,vals,color=cols)

Но более правильный вариант,- создать столбец с цветом. То есть скопировать столбец со значениями применив к нему пользовательскую функцию

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'segment': ["X", "Y", "Z", "W"], 'scores': [0.1, 0.3, 0.7, 0.9]})
def func(a):
    '''
    Тута любой кодб возвращающий цвет для значения
    '''
    colorN=['#A52A2A', '#E50000', '#FFA500', '#FFFF00', '#00FF00','#000000']
    colorV = [0, 0.2, 0.4, 0.6, 0.8, 1] #must be sorted and size as colorN
    for num,val in enumerate(colorV):
        if val>=a:
            return colorN[num];
df['colors']=df['scores'].apply(func)
print(df)
'''
  segment  scores   colors
0       X     0.1  #E50000
1       Y     0.3  #FFA500
2       Z     0.7  #00FF00
3       W     0.9  #000000
'''

ax = df.plot.barh(x='segment', y='scores',color=list(df['colors']))
plt.show()
→ Ссылка