У каждой ячейки гистограммы есть свой цвет

#python #pandas #matplotlib #seaborn #histogram

Вопрос:

Я построил гистограмму и хотел бы, чтобы каждый из ящиков имел другой цвет. Прямо сейчас я получаю сообщение об ошибке: «Аргумент ключевого слова»цвет» должен иметь один цвет для каждого набора данных, но был предоставлен 1 набор данных и 10 цветов».

Я также прилагаю скриншот гистограммы. Заранее спасибо гистограмма

 decades = np.arange(1910, 2020, 10)
colors = ['aqua', 'red', 'gold', 'royalblue', 'darkorange', 'green', 'purple', 'cyan', 'yellow', 'lime']

plt.figure(figsize=(12,7))
plt.hist(df.Year, bins=decades, color=colors)
plt.xticks(decades);
 

Ответ №1:

Ключевое слово colors предназначено только для случая, когда вы хотите построить несколько наборов данных (=гистограмм) одновременно. Его нельзя использовать для окрашивания полос по отдельности.

Однако вы можете записать результат с hist помощью команды и выполнить итерацию по результату, чтобы задать цвет. Это позволяет вам также использовать информацию о значении или ячейке, если вам это необходимо (например, для цвета на основе значения), но можно использовать ваш пример для простого назначения уникального цвета (на основе заказа).

Например:

 import matplotlib.pyplot as plt
import numpy as np

decades = np.arange(1910, 2020, 10)
data = np.random.gamma(4, scale=0.2, size=1000)*110 1910
colors = ['aqua', 'red', 'gold', 'royalblue', 'darkorange', 'green', 'purple', 'cyan', 'yellow', 'lime']

fig, ax = plt.subplots(figsize=(8,4), facecolor='w')
cnts, values, bars = ax.hist(data, edgecolor='k', bins=decades)
ax.set_xticks(decades)

for i, (cnt, value, bar) in enumerate(zip(cnts, values, bars)):
    bar.set_facecolor(colors[i % len(colors)])
 

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

Или цвет в зависимости от значения:

 cmap = plt.cm.viridis

for i, (cnt, value, bar) in enumerate(zip(cnts, values, bars)):
    bar.set_facecolor(cmap(cnt/cnts.max()))
 

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

Комментарии:

1. Большое вам спасибо за объяснение, Рутгер!

Ответ №2:

  • Следующее отвечает на данные в ОП, а не на название.
  • Гистограмму лучше всего использовать для непрерывных данных (например, плавающих). Эти данные разбиты по годам на десятилетия, поэтому они дискретны, что означает, что это всего лишь столбчатая диаграмма значений.
  • В соответствии с операцией данные находятся в фрейме данных pandas ( df.Year ), поэтому получите .value_counts из 'Year' , а затем постройте график с pandas.DataFrame.plot и kind='bar' , который используется matplotlib в качестве бэкэнда. Это также имеет color значение в качестве параметра.
  • Протестировано в python 3.8.11 , pandas 1.3.2 , matplotlib 3.4.2 , seaborn 0.11.2
 import pandas as pd
import numpy as np

# sample data
np.random.seed(365)
data = {'Year': np.random.choice(np.arange(1910, 2020, 10), size=1100)}
df = pd.DataFrame(data)

# display(df.head())
   Year
0  1930
1  1950
2  1920
3  1960
4  1930

# get the value counts and sort
vc = df.Year.value_counts().sort_index()

# plot
colors = ['aqua', 'red', 'gold', 'royalblue', 'darkorange', 'green', 'purple', 'steelblue', 'yellow', 'lime', 'magenta']
vc.plot(kind='bar', color=colors, width=1, rot=0, ec='k')
 

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

sns.countplot

  • seaborn является высокоуровневым API для matplotlib
  • При .countplot этом нет необходимости использовать .value_counts()
 p = sns.countplot(data=df, x='Year', palette=colors)
 

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

Комментарии:

1. @Лука, пожалуйста. Не стесняйтесь голосовать, если это полезно. Счастливого Кодирования!