как построить круговую диаграмму из списка цветов

привет, у меня есть dict с 3-int-tuple, представляющим цвет (как ключ), и int, представляющий количество вхождений этого цвета в изображении (как значение)

например, это изображение размером 4x4 пикселя с 3 цветами: {(87, 82, 44): 1, (255, 245, 241): 11, (24, 13, 9): 4}

я хочу построить круговую диаграмму списка [1,11,4], в которой каждый фрагмент круговой диаграммы окрашен правильным цветом .. как я могу это сделать?


person nkint    schedule 27.02.2011    source источник


Ответы (2)


Обновление: другой ответ от Пола намного лучше, но мне нет никакого смысла редактировать исходный ответ до тех пор, пока он не станет таким же :) (Я не могу удалить этот ответ, потому что он принят.)

Это делает то, что вы хотите? Я просто взял пример из документации matplotlib и превратил ваши данные в параметры, которые pie() ожидает:

# This is a trivial modification of the example here:
# http://matplotlib.sourceforge.net/examples/pylab_examples/pie_demo.html

from pylab import *

data = {(87, 82, 44): 1, (255, 245, 241): 11, (24, 13, 9): 4}

colors = []
counts = []

for color, count in data.items():
    colors.append([float(x)/255 for x in color])
    counts.append(count)

figure(1, figsize=(6,6))

pie(counts, colors=colors, autopct='%1.1f%%', shadow=True)
title('Example Pie Chart', bbox={'facecolor':'0.8', 'pad':5})

show()

Результат выглядит так:

Результирующая круговая диаграмма

person Mark Longair    schedule 27.02.2011

Марк опередил меня на 5 минут, так что очки должны достаться ему, но вот мой (почти идентичный, но более сжатый) ответ в любом случае:

from matplotlib import pyplot

data = {(87, 82, 44): 1, (255, 245, 241): 11, (24, 13, 9): 4}
colors, values = data.keys(), data.values()
# matplotlib wants colors as 0.0-1.0 floats, not 0-255 ints
colors = [tuple(i/255. for i in c) for c in colors]
pyplot.pie(values, colors=colors)
pyplot.show()
person Paul    schedule 27.02.2011
comment
+1: Отсутствие импорта * явно более разумно :) Я бы отказался использовать zip (* ...) для разделения элементов на том основании, что это плохо, если список большой, но это вряд ли актуально в этом примере ... - person Mark Longair; 27.02.2011
comment
:) Ах, я никогда раньше не замечал этот полезный бит в документации: если items (), keys (), values ​​(), iteritems (), iterkeys () и itervalues ​​() вызываются без каких-либо промежуточных изменений в словарь, списки будут напрямую соответствовать. Вы не возражаете, если я внесу это изменение в свой ответ со ссылкой на ваш ответ? - person Mark Longair; 27.02.2011
comment
(Очевидно, я не могу просто удалить свой ответ сейчас, когда он был принят, что было бы моим предпочтением ...) - person Mark Longair; 27.02.2011
comment
@Mark: Да, мне тоже пришлось поискать порядок диктовки. Ваше решение соответствовало всем требованиям OP с абсолютно незначительными проблемами производительности для заявленного варианта использования. Вдобавок ко всему, он гораздо более ясен и понятен, т.е.не требует каких-либо знаний в области понимания списков или правил упорядочивания словаря. Лучше - это всего лишь вопрос мнения. - person Paul; 28.02.2011