2016-02-04 3 views
3

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

У меня есть функция, которая создает круговую диаграмму из наборов значений и данных категории. Вот один пример:

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 

Проблема заключается в том, что данные отличаются от одного экземпляра к другому, и что, в свою очередь изменяет порядок категорий. Таким образом, каждая категория получает каждый цвет, каждый раз, когда я создаю диаграмму. Я мог сортировать данные в алфавитном порядке каждый раз, но это вызывает две проблемы: некоторые категории отсутствуют в некоторых наборах данных, и я бы предпочел, чтобы он отсортировался по размеру так или иначе, чтобы наименьшие клины ориентировались горизонтально.

Как установить matplotlib для назначения цветов в зависимости от, скажем, индекса pandas.Series?

Вот код, который я использую для создания круговой диаграммы:

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) 

EDIT: Я забыл объяснить функцию autopct, это для добавления стоимости и процентных меток:

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 

ответ

2

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

Вот непроверенных бит кода, который может делать то, что вы ищете:

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() 
+0

Спасибо, я дам ему идти. – Charon

+0

Это работает! Спасибо. – Charon

Смежные вопросы