Закрасить гистограмму разным цветом

Подскажите, пожалуйста, каким способом можно раскрасить гистограмму используя параметр colormap чтобы отображалась вся палитра заданной темы, например тема - turbo?

Мой код:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("test.csv", delimiter=";", encoding="utf-8").fillna("Null")
df.head()
vc = df["ID"].value_counts()
vc_id = (vc.loc[["79","787","20","125","119","89"]])
fig, ax_vc = plt.subplots(figsize=(16,8))
ax_vc.margins(y=0.45)
vc_id.plot(kind="bar", legend=False, colormap="turbo")
for i, perf in enumerate(vc_id):
    ax_vc.text(i, perf + 8, str(perf), color="black", ha="center", fontweight="bold", fontname="serif", fontsize=10)
plt.yscale("log")
plt.xticks(rotation=0)
plt.show()

Для раскраски гистограммы использую параметр colormap="turbo", но гистограмма закрашивается только тем цветом, который идёт на 1ом месте в шкале цвета, т.е.:

введите сюда описание изображения

Пробовал использовать подставку цветов через цикл:

colors = ["red" if i > 250 else "blue" for i in vc_id]
vc_id.plot(kind="bar", legend=False, color=colors)

Работает следующим образом:

введите сюда описание изображения

Если добавить список цветов в переменную colors = ["red", "blue", "green"] то работает так:

введите сюда описание изображения

Подскажите, пожалуйста, как всё таки использовать тему цветовой палитры в моём случае?

Большое спасибо.


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

Автор решения: Pak Uula

Ответ на ваш вопрос, как раскрасить столбцы в разные цвета при помощи colormap - почти никак.

Параметр colormap в DataFrame.plot определяет каким цветом рисовать каждую отдельную колонку. Так как у вас на чертеже только одна колонка, то все столбцы в случае colormap отрисовываются одним цветом.

Добавьте ещё пару колонок и посмотрите, что будет.

df = pd.DataFrame.from_dict(\
                            {79 : 699, 787: 390, 20: 191, 125: 163, 119: 119, 89: 146},
                            orient='index',
                            columns=['Count']
)
df["c1"] = [100,200,300,400,500,600]
df["c2"] = [600,500,400,300,200, 100]

fig, ax_vc = plt.subplots(figsize=(16,8))
ax_vc.margins(y=0.45)
df.plot(kind="bar", legend=False, colormap="turbo", ax=ax_vc);

введите сюда описание изображения

Видите? У каждого набора свой цвет.

C параметром color дело обстоит хитрее. Когда у вас один набор данных, то цвета из color используются для раскрашивания отдельных столбцов, как у вас в примере. Если же наборов несколько, то цвета используются для выбора в какой цвет красить столбцы отдельных наборов.

df.plot(kind="bar", legend=False, color=["red", "green", "blue", "pink", "yellow", "black"])

введите сюда описание изображения

Извлечь цвета из colormap

Однако не всё потеряно. Можно извлечь цвета из цветовой карты и задать их для каждого столбца индивидуально.

Объект типа Colormap можно вызвать как функцию, передав параметр от 0 до 1. В ответ карта вернёт цвет в кодировке RGBA, соответствующий параметру.

turbo_cm = matplotlib.cm.get_cmap('turbo')
colors = [turbo_cm(v) for v in np.linspace(0,1,len(df))]
df.Count.plot(kind="bar", legend=False, color=colors)

введите сюда описание изображения

→ Ссылка