Установить цвета в столбчатой ​​диаграмме с накоплением для каждой метки - PullRequest
1 голос
/ 15 мая 2019

Я хочу, чтобы при каждом запуске барплота появлялись одни и те же цвета. Например: B1 = зеленый, B2, красный, B3 = синий и т. Д.

Я до сих пор пробовал .setcolor, но он не позволяет мне устанавливать цвета для отдельных номеров ящиков (B1, B2 и т. Д.) - я не мог понять это.

import pandas as pd
import seaborn as sns


d = {'DAY': [55,56,58,65], 'B1': [2,6,6,1],  'B2': [1,0,21,0], 'B3': [0,1,0,1]}
data1= pd.DataFrame(data = d)

sns.set()
data1.set_index('DAY').plot(kind='bar', stacked=True)

enter image description here

Это работает, но назначает разные цвета для B1, B2, B3 и т. Д., Как только у меня появляются новые данные.

Например, давайте дадим ему некоторые игрушечные данные:

t = {'DAY': [55,56,58,65], 'B1': [2,6,6,1],  'B3': [0,1,0,1]}
toy1= pd.DataFrame(data = t)
sns.set()
toy1.set_index('DAY').plot(kind='bar', stacked=True)

enter image description here

B3 здесь оранжевый, тогда как в первом он был зеленым.

1 Ответ

0 голосов
/ 15 мая 2019

Создайте словарь и сопоставьте столбцы с этими цветами.Поскольку мы перебираем столбцы, цвета будут в том же порядке, что и столбцы.Вам нужно будет определить цвета для всех ваших различных столбцов.

def gen_colors(df):
    col_d = {'B1': 'red', 'B2': 'black', 'B3': 'green'}
    return [col_d[col] for col in df.columns if 'B' in col]

sns.set()

d = {'DAY': [55,56,58,65], 'B1': [2,6,6,1],  'B2': [1,0,21,0], 'B3': [0,1,0,1]}
data1 = pd.DataFrame(data = d)
data1.set_index('DAY').plot(kind='bar', stacked=True, color=gen_colors(data1))

enter image description here

t = {'DAY': [55,56,58,65], 'B1': [2,6,6,1],  'B3': [0,1,0,1]}
toy1 = pd.DataFrame(data = t)
toy1.set_index('DAY').plot(kind='bar', stacked=True, color=gen_colors(toy1))

enter image description here


Это, однако, делаетне гарантировать, что порядок соответствует.То есть, если ваш DataFrame упорядочен по-разному, хотя B3 всегда будет одного цвета, он может оказаться выше или ниже B1 при штабелировании.Более последовательным решением является переиндексация.Вы должны включить все Bi, которые найдены во всех ваших фреймах данных, которые должны отображаться последовательно.Здесь я выбрал произвольно большое число от 1 до 9:

t = {'DAY': [55,56,58,65], 'B3': [0,1,0,1], 'B1': [2,6,6,1]}
toy1 = pd.DataFrame(data = t)

toy1 = toy1.reindex(['DAY'] + [f'B{i}' for i in range(1,10)], axis=1)
toy1.set_index('DAY').plot(kind='bar', stacked=True)

enter image description here

Хотя B3 появляется первым в DataFrame, он все же отображается на графике выше B1и с третьим цветом в цикле.

...