Atribuir cores específicas aos dados no gráfico circular Matplotlib

Estou a tentar criar gráficos circulares com matplotlib em que a cor de cada categoria é fixa.

tenho uma função que cria um gráfico circular a partir de conjuntos de dados de valor e categoria. Aqui está um exemplo:

Category     Value
TI           65
Con          43
FR           40
TraI         40
Bug          38
Data         22
Int          15
KB           12
Other        8
Dep          7
PW           6
Uns          5
Perf         4
Dep          3

o problema é que os dados diferem de uma instância para outra, e que por sua vez muda a ordem das categorias. Assim, cada categoria é rotulada de uma cor diferente cada vez que eu gerar um gráfico. Eu poderia ordenar os dados alfabeticamente todas as vezes, mas isso causa dois problemas: algumas categorias estão faltando em alguns conjuntos de dados, e eu preferiria que fosse classificado pelo tamanho de qualquer maneira para que as cunhas menores sejam orientadas horizontalmente.

Como posso definir matplotlib para atribuir cores dependendo, digamos, do Índice de a pandas.Series?

Aqui está o código que estou a usar para gerar um gráfico circular.
import matplotlib.pyplot as plt

slices = [62, 39, 39, 38, 37, 21, 15,  9,  6,  7,  6,  5,  4, 3]

cmap = plt.cm.prism
colors = cmap(np.linspace(0., 1., len(slices)))

labels = [u'TI', u'Con', u'FR', u'TraI', u'Bug', u'Data', u'Int', u'KB', u'Other', u'Dep', u'PW', u'Uns', u'Perf', u'Dep']

fig = plt.figure(figsize=[10, 10])
ax = fig.add_subplot(111)

pie_wedge_collection = ax.pie(slices, colors=colors, labels=labels, labeldistance=1.05, autopct=make_autopct(slices))

for pie_wedge in pie_wedge_collection[0]:
    pie_wedge.set_edgecolor('white')

titlestring = 'Issues'

ax.set_title(titlestring)

editar: esqueci-me de explicar a função autopct, é para adicionar valor e etiquetas de percentagem:

def make_autopct(values):
    def my_autopct(pct):
        total = sum(values)
        val = int(round(pct*total/100.0))
        return '{p:.2f}%  ({v:d})'.format(p=pct,v=val)
    return my_autopct
Author: Charon, 2016-02-04

1 answers

Eis uma ideia que podias tentar. Faça um dicionário de suas etiquetas e cores, para que cada cor seja mapeada para uma etiqueta. Em seguida, depois de fazer o gráfico circular, vá em um assign o facecolor da Cunha usando este dicionário.

Aqui está um pedaço de código não testado que pode fazer o que você está procurando:

import numpy as np
import matplotlib.pyplot as plt

def mypie(slices,labels,colors):

    colordict={}
    for l,c in zip(labels,colors):
        print l,c
        colordict[l]=c

    fig = plt.figure(figsize=[10, 10])
    ax = fig.add_subplot(111)

    pie_wedge_collection = ax.pie(slices, labels=labels, labeldistance=1.05)#, autopct=make_autopct(slices))

    for pie_wedge in pie_wedge_collection[0]:
        pie_wedge.set_edgecolor('white')
        pie_wedge.set_facecolor(colordict[pie_wedge.get_label()])

    titlestring = 'Issues'

    ax.set_title(titlestring)

    return fig,ax,pie_wedge_collection

slices = [37, 39, 39, 38, 62, 21, 15,  9,  6,  7,  6,  5,  4, 3]
cmap = plt.cm.prism
colors = cmap(np.linspace(0., 1., len(slices)))
labels = [u'TI', u'Con', u'FR', u'TraI', u'Bug', u'Data', u'Int', u'KB', u'Other', u'Dep', u'PW', u'Uns', u'Perf', u'Dep']

fig,ax,pie_wedge_collection = mypie(slices,labels,colors)

plt.show()
 2
Author: tom, 2016-02-04 16:52:22