Создайте уникальную «глобальную» цветовую карту для использования на нескольких столбчатых диаграммах - PullRequest
0 голосов
/ 05 марта 2020

Я хочу создать цветовую карту, которая не является простым массивом цветов, а скорее похожа на словарь, в котором каждый цвет назначен на определенный тег c.

Мои данные находятся в форме фреймов данных, где у меня есть дробные числа для каждого тега c. Ниже приведен упрощенный пример:

T1 = pd.DataFrame({'S1': [0.7, 0.1, 0.05, 0.05, 0, 0.03, 0.033, 0.033, 0, 0]}, index=['B','C','D','F','G','H','I','M','N','P'])
T2 = pd.DataFrame({'S2': [0.6, 0.1, 0.1,  0.05, 0.05, 0.033, 0.033, 0.033, 0]}, index=['A','D','E','F','G','H','I','L','M'])

Я хочу представить свои данные в виде столбцов с накоплением.

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

То, что я хочу, - это возможность создавать «постоянная» цветовая карта для сохранения согласованности цветов на разных графиках Затем я могу построить каждый фрейм данных отдельно, но убедитесь, что каждая категория всегда отображается одинакового цвета (т. Е. 'G' всегда красный).

Поскольку список категорий может быть длиной 50-60 после объединения, Мне нужно назначить им уникальные случайные цвета.

M.

1 Ответ

0 голосов
/ 05 марта 2020

Если я хорошо понял, это могло бы помочь:

import matplotlib._color_data as mcd
import pandas as pd

index1 = ['B','C','D','F','G','H','I','M','N','P']
index2 = ['A','D','E','F','G','H','I','L','M']
T1 = pd.DataFrame({'S1': [0.7, 0.1, 0.05, 0.05, 0, 0.03, 0.033, 0.033, 0, 0]}, index=index1)
T2 = pd.DataFrame({'S2': [0.6, 0.1, 0.1,  0.05, 0.05, 0.033, 0.033, 0.033, 0]}, index=index2)

indexes = set(index1).union(set(index2))
colores = list(mcd.XKCD_COLORS.values())[0:len(indexes)]
paleta = {i:c  for i, c in zip(indexes, colores)}

T1.T.plot.bar(color=T1.index.map(paleta), stacked=True)
T2.T.plot.bar(color=T2.index.map(paleta), stacked=True)

Я создаю dict с индексом в качестве ключа и цветами в качестве значений, затем я отображаю индекс каждого df, используя dict.

...