Как дать панды/библиотек matplotlib столбчатой диаграммы пользовательские цвета


Я только начал использовать pandas / matplotlib в качестве замены Excel для создания сложенных гистограмм. Я столкнулся с проблемой

(1) в цветовой карте по умолчанию есть только 5 цветов, поэтому, если у меня есть более 5 категорий, то цвета повторяются. Как я могу указать больше цветов? В идеале, градиент с начальным цветом и конечным цветом, а также способ динамического генерирования n цветов между ними?

(2) цвета не очень визуально приятным. Как я могу указать пользовательский набор из N цветов? Или, градиент также будет работать.

пример, который иллюстрирует оба вышеуказанных пункта, приведен ниже:

  4 from matplotlib import pyplot
  5 from pandas import *
  6 import random
  7 
  8 x = [{i:random.randint(1,5)} for i in range(10)]
  9 df = DataFrame(x)
 10 
 11 df.plot(kind='bar', stacked=True)

и вывод такой:

3 52

3 ответа:

вы можете указать color опция в виде списка непосредственно к .

from matplotlib import pyplot as plt
from itertools import cycle, islice
import pandas, numpy as np  # I find np.random.randint to be better

# Make the data
x = [{i:np.random.randint(1,5)} for i in range(10)]
df = pandas.DataFrame(x)

# Make a list by cycling through the colors you care about
# to match the length of your data.
my_colors = list(islice(cycle(['b', 'r', 'g', 'y', 'k']), None, len(df)))

# Specify this list of colors as the `color` option to `plot`.
df.plot(kind='bar', stacked=True, color=my_colors)

чтобы определить свой собственный список, вы можете сделать несколько из следующих действий или просто посмотреть методы Matplotlib для определения элемента цвета по его значениям RGB и т. д. Вы можете получить так сложно, как вы хотите с этим.

my_colors = ['g', 'b']*5 # <-- this concatenates the list to itself 5 times.
my_colors = [(0.5,0.4,0.5), (0.75, 0.75, 0.25)]*5 # <-- make two custom RGBs and repeat/alternate them over all the bar elements.
my_colors = [(x/10.0, x/20.0, 0.75) for x in range(len(df))] # <-- Quick gradient example along the Red/Green dimensions.

последний пример дает следующий простой градиент цветов для меня:

enter image description here

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

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

Я нашел самый простой способ-использовать на .plot() С одним из предустановленных цветовых градиентов:

df.plot(kind='bar', stacked=True, colormap='Paired')

enter image description here

вы можете найти большое список предустановленных цветовых карт здесь.

colormaps

для более подробного ответа на создание собственных цветовых карт, я настоятельно рекомендую посетить на этой странице

если это ответ слишком много работы, вы можете быстро сделать свой собственный список цветов и передавать их в