Задать цвета в столбчатой ​​диаграмме с накоплением в соответствии с SEMI-известным ярлыком - PullRequest
0 голосов
/ 20 мая 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))

works

Теперь я строю это на примере, например, что если мы не знаем расширение метки. (Невозможно заранее знать расширения меток, и они будут иметь имена, такие как B1_Active, B2_Missing, B3_Double .. (Имя после B * называется статусом поля)

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

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

    try:
        toy1.set_index('DAY').plot(kind='bar', stacked=True, color=gen_colors(toy1))
    except:
        toy1.set_index('DAY').plot(kind='bar', stacked=True)

Это просто приводит к случайному выбору цветов. Как сделать словарь, чтобы дать разные оттенки красного цвета, когда метка начинается с B1, например, B1_Active = красный, B1_Missing = огнеупорный кирпич и т. Д. Я хочу сохранить основной цвет одинаковым для всех комбинаций B1, но добавить легкий оттенок, чтобы дифференцировать статус .. это возможно? Я искал в словаре "поймать все", но не смог работать с регулярным выражением. Спасибо

enter image description here

Также это палитра:

enter image description here

1 Ответ

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

Ваши расширения меток имеют формат B {число} _ {статус}.Считай, мы называем их labex.Функция split из библиотеки регулярных выражений позволяет отделить статус от остальных.Например,

import re
labex = 'B1_Active'
re.split(r'_', labex)
# ['B1', 'Active']

Теперь я буду считать, что вы знаете, сколько существует B и возможностей состояния.Вы можете просто использовать defaultdict (импортированный из коллекций), чтобы сохранить ваши цвета в соответствии со значением B, и список для хранения индекса, присвоенного каждому статусу.

from collections import defaultdict
import re
colours = defaultdict(list)
colours['B1'] = ['xkcd:red', 'xkcd:bright red', 'xkcd:crimson']
colours['B2'] = ['xkcd:green', 'xkcd:grass green', 'xkcd:forest green']
colours['B3'] = ['xkcd:blue', 'xkcd:sky blue', 'xkcd:cerulean']
status = ['Active', 'Missing', 'Double']
labex = 'B2_Missing'
colours[re.split(r'_', labex)[0]][status.index(re.split(r'_', labex)[1])]
# xkcd:grass green

Это должно дать вам место для начала.Значения состояния не должны быть известны заранее, так как вы можете просто инициализировать состояние как «[]» и добавлять к нему новые значения по мере их появления.Та же логика применима к значениям B, но вам нужно как-то где-то в памяти сохранять цветовые оттенки, или вы должны иметь возможность генерировать их на лету.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...